promise:
大多数浏览器中不能终止的 Promise 链里的 rejection,要加catch。 promise将以前的回调地狱转成了promise链,同样要避免嵌套
doSomething()
.then(function(result) {
return doSomethingElse(result);
})
.then(newResult => doThirdThing(newResult))
.then(() => doFourthThing())
.catch(error => console.log(error));
避免timeout和promise时序问题,用promise将timeout封装起来:
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));
wait(10000).then(() => saySomething("10 seconds")).catch(failureCallback);
为什么创建实例里的函数参数名为resolve,而不是reject。
var _reject = function(err) {
return Promise.reject(err)
}
var resolver = function(resolve, reject) {
return resolve(_reject(new Error("reject within resolve")))
}
var p = new Promise(resolver);
p.then(function(data) {
console.log("resolved", data)
},function(data) {
console.log("rejected:", data, "promise:", p)
})
promise从pending状态转化成其他状态时,并不能判定就是fulfilled,resolve的意思是决议,也就是当前promise还在判断阶段,如果非要说reject是拒绝而resolve就是成功,这是不准确的,就如上例,
async:
promise有拒绝事件PromiseRejectionEvent,nodejs里会输出错误(reject或者catch),但是async就要自己try catch喽
async function foo() {
try {
const result = await doSomething();
const newResult = await doSomethingElse(result);
const finalResult = await doThirdThing(newResult);
console.log(`Got the final result: ${finalResult}`);
} catch(error) {
failureCallback(error);
}
}
这是巧妙的用for of 遍历执行异步操作
let result;
for (const f of [func1, func2, func3]) {
result = await f(result);
}
promise其他方法
Promise.resolve() 和 Promise.reject() 是手动创建一个已经 resolve 或者 reject 的 Promise 快捷方法。它们有时很有用。
Promise.all() 和 Promise.race() 是并行运行异步操作的两个组合式工具。