前言
最近实在是发生太多事情。
昨天差点露宿接头,今天终于把房子搞定了。
接下来,又可以专心的写代码了。
处理异步的方式(之前)
- 事件模式
- 回调模式
简介
promise是一个异步操作结果的占位符
promise有三种状态: pending, fulfilled, rejected
Node.js错误处理
process对象有两个关于promise错误的事件:
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
事件只有一个参数promise
浏览器错误处理
浏览器的错误处理稍有不同
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;
});
链式调用
promise是一个thenable, 你可以直接return一个value,它会自动帮你包装成一个新的promise。当然,你也可以直接return一个新的Promise。
Promise.prototype.then(onFulfilled[,onRejected])
onFullfilled : 成功后的回调函数
onRejected:错误后的毁掉函数
Promise.prototype.catch(onRejected)
相当于Promise.prototype.then(null,onRejected)
Promise.all(iterable)
当所有项都完成后进行下一步,或者当某一项出错后触发rejected
会将iterable里所有项结果按次序放在数组内。
Promise.race(iterable)
当有一项完成后进行下一步
Promise.resolve(value/promise/thenable)
Promise.rejected(reason)
基于Promise的异步任务
结合第八章的例子(使用Generate配合回调函数),稍微的改造一下
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改造后,使得这个方法简单了很多。
同时,也不需要再像回调函数那样要求错误优先。
网友评论