TypeScript版Ajax包括json、jsonp、post等请求,使用Promise 对象返回结果,支持async/await解决回调地狱,书写更舒适。const hasOwnProperty = Object.prototype.hasOwnProperty;
interface EachObject {
[ key: string ]: any,
readonly length?: number,
}
function forEach(
obj: EachObject,
iterator: (value?: any, key?: number | string, obj?: EachObject) => boolean | void,
context?: Object
) {
if (!obj) {
return;
}
if (obj.length && obj.length === +obj.length) {
for (let i = 0; i < obj.length; i++) {
if (iterator.call(context, obj[i], i, obj) === true) return;
}
} else {
for (const k in obj) {
if (hasOwnProperty.call(obj, k)) {
if (iterator.call(context, obj[k], k, obj) === true) return;
}
}
}
}
const Types: {
[key: string]: (obj: Object) => boolean;
} = {};
const _toString: () => string = Object.prototype.toString;
forEach([
'Array',
'Boolean',
'Function',
'Object',
'String',
'Number',
], (name: number) => {
Types[`is${name}`] = function (obj: Object) {
return _toString.call(obj) === `[object ${name}]`;
}
});
// Object to queryString
function serialize(obj: EachObject): string {
const q: string[] = [];
forEach(obj, (val, key) => {
if (Types.isArray(val)) {
forEach(val, (v, i) => {
q.push(`${key}=${encodeURIComponent(v)}`);
});
} else {
q.push(`${key}=${encodeURIComponent(val)}`);
}
});
return q.join('&');
}
function parseJSON(str: string): Object {
try {
return JSON.parse(str);
} catch (e) {
try {
return (new Function(`return ${str}