美文网首页
Promise-《understanding-ECMAScipt

Promise-《understanding-ECMAScipt

作者: aliyu | 来源:发表于2017-07-05 00:07 被阅读16次

前言

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

处理异步的方式(之前)

  • 事件模式
  • 回调模式

简介

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改造后,使得这个方法简单了很多。
同时,也不需要再像回调函数那样要求错误优先。

相关文章

  • Promise-《understanding-ECMAScipt

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

  • 2019-03-06

    1.行文思路 JS中处理异步 由callback->promise->generater->async/await...

  • 小议express,koa,koa2

    express->koa->koa2其实就是回调->promise->co或者是generator->await ...

  • promise-红黄绿灯

    思路:封装一个promise,执行灯亮,再设置settimeout,几秒后再执行该promise。 1、代码截图:...

  • 7-promise

    promise-感性认知 作用:解决异步回调问题。有了Promise对象,就可以将异步操作以同步操作的流程表达出来...

  • js callback->Promise->async/awai

    之前在知乎上听了个live,当时在发布,没认真听、也没怎么听清,今天又重新听了一遍,理了一下中间的技术以及一些知识...

  • Promise-优雅地进行JavaScript异步编程

    1、异步编程和回调函数 网络数据传输和磁盘读写等操作是十分耗时的,JavaScript引擎会把这些耗时的操作陷入其...

  • ES6的Promise-解决回调地狱

    如下面一段代码: 通过ES6的Promise对象来解决: 介绍 一个 Promise 对象可以理解为一次将要执行的...

网友评论

      本文标题:Promise-《understanding-ECMAScipt

      本文链接:https://www.haomeiwen.com/subject/galzcxtx.html