Promise-《understanding-ECMAScipt6》读书笔记11

前言

最近实在是发生太多事情。
昨天差点露宿接头,今天终于把房子搞定了。
接下来,又可以专心的写代码了。

处理异步的方式(之前)

  • 事件模式
  • 回调模式

简介

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改造后,使得这个方法简单了很多。
同时,也不需要再像回调函数那样要求错误优先。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容