前言
最近實(shí)在是發(fā)生太多事情摧扇。
昨天差點(diǎn)露宿接頭圣贸,今天終于把房子搞定了。
接下來扛稽,又可以專心的寫代碼了吁峻。
處理異步的方式(之前)
- 事件模式
- 回調(diào)模式
簡介
promise是一個(gè)異步操作結(jié)果的占位符
promise有三種狀態(tài): pending, fulfilled, rejected
Node.js錯(cuò)誤處理
process對(duì)象有兩個(gè)關(guān)于promise錯(cuò)誤的事件:
unhandleRejection
,rejectionHandle
let rejected;
process.on("unhandleRejection",function(reason,promise){
console.log(reason.message); // "Explosion!";
console.log(promise === rejected) //true;
});
rejected = Promise.reject(new Error("Explosion!"));
let rejected;
process.on("rejectionHandled",function(promise){
console.log(promise === rejected) //true;
});
rejected = Promise.reject(new Error("Explosion!"));
rejectionHandled
事件只有一個(gè)參數(shù)promise
瀏覽器錯(cuò)誤處理
瀏覽器的錯(cuò)誤處理稍有不同
let rejected;
window.unhandleRejection = function(event){
console.log(event.type); // unhandleRejection
console.log(event.reason.message) //"Explosion!";
console.log(event.promise === rejected) //true;
});
window.rejectionHandled= function(event){
console.log(event.type); // rejectionHandled
console.log(event.reason.message) //"Explosion!";
console.log(event.promise === rejected) //true;
});
鏈?zhǔn)秸{(diào)用
promise是一個(gè)thenable, 你可以直接return一個(gè)value,它會(huì)自動(dòng)幫你包裝成一個(gè)新的promise在张。當(dāng)然用含,你也可以直接return一個(gè)新的Promise。
Promise.prototype.then(onFulfilled[,onRejected])
onFullfilled : 成功后的回調(diào)函數(shù)
onRejected:錯(cuò)誤后的毀掉函數(shù)
Promise.prototype.catch(onRejected)
相當(dāng)于Promise.prototype.then(null,onRejected)
Promise.all(iterable)
當(dāng)所有項(xiàng)都完成后進(jìn)行下一步帮匾,或者當(dāng)某一項(xiàng)出錯(cuò)后觸發(fā)rejected
會(huì)將iterable里所有項(xiàng)結(jié)果按次序放在數(shù)組內(nèi)啄骇。
Promise.race(iterable)
當(dāng)有一項(xiàng)完成后進(jìn)行下一步
Promise.resolve(value/promise/thenable)
Promise.rejected(reason)
基于Promise的異步任務(wù)
結(jié)合第八章的例子(使用Generate配合回調(diào)函數(shù)),稍微的改造一下
function run (taskDef){
let task = taskDef();
let result = task.next();
(function step(){
if(!result.done){
let promise = Promise.resolve(result.value);
promise.then(function(value){
result = task.next(value);
step();
}).catch(function(err){
result = task.throw(err);
step();
})
}
})()
}
可以看的出來瘟斜,用Promise改造后肠缔,使得這個(gè)方法簡單了很多。
同時(shí)哼转,也不需要再像回調(diào)函數(shù)那樣要求錯(cuò)誤優(yōu)先明未。