Promise是一个构造函数,

什么是promise

  • 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理,让开发者不用再关注于时序和底层的结果。Promise的状态具有不受外界影响和不可逆两个特点。

传统回调式异步操作的缺点

Promise是如何解决异步操作

传统回调的五大信任问题

  • 调用回调过早
  • 调用回调过晚(或没有被调用)
  • 调用回调次数过少或过多
  • 未能传递所需的环境和参数
  • 吞掉可能出现的错误和异常

Promise的解决方法

  • 调用回调过早
    • 对于Promise来说,即使是立即完成的Promise也无法被同步观察到,也就是说一个Promise调用then()的时候,即使这个Promise已经决议了,提供给then的回调也总会被异步调用。
  • 调用回调过晚(或没有被调用)
    • 对于一个Promise对象注册的每一个观察回调都是相对独立、互不干预的。而Promise对象调用resolve()和reject()时,每个注册的观察回调也都会被自动调度。所以这些观察回调的任意一个都无法影响或延误对其他回调的调用。
    • 此外,关于回调未调用。正常情况下,没有任何东西可以阻止Promise向你通知它的决议,即使你的JavaScript代码报错了,一会通过异常回调来捕获到。如果Promise永远不被决议的话,Promise本身已提供了竞态的抽象机制来作为解决方案。
  • 调用回调次数过少或过多
    • Promise的定义方式使得它只能被决议一次。即使代码中出现多次决议,这个Promise也会接受第一次决议,并会忽略掉其他任何后续调用。所以任何通过then()注册的回调只会被调用一次。
  • 未能传递所需的环境和参数
    • 凡是被决议的值都会传递到观察回调中,如果没有显示的决议值也会传递一个undefined给观察回调。需要注意的是,Promise只允许传一个决议值,其他值将会被默默忽略掉。
  • 吞掉可能出现的错误和异常

    • 如果在创建Promise时,存在JavaScript代码错误,会直接导致该Promise的拒绝决议,那么你可以通过reject()来捕获异常,代码中的任何异常都不会吞掉。

Promise实例

function test(successFn,errorFn){
    var timeOut = Math.random() * 2;
    console.log('输出时间: ' + timeOut);
    setTimeout(function(){
        if(timeOut < 1){
            console.log('success');
            successFn('ok');
        }else{
            console.log('error');
            errorFn('error');
        }
    })
}
new Promise(test)
    .then(function(t){
        console.log( '成功:' + t );
    }).catch(function(r){
        console.log( '失败:' + r );
    });
以上文章来自:黄卉 , https://huanghui8030.github.io/js/js09.html