美文网首页
Promise--异步的解决方案

Promise--异步的解决方案

作者: YangJeremy | 来源:发表于2018-02-23 23:31 被阅读0次

    Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口,使得异步操作具备同步操作的接口。Promise 可以让异步操作写起来,就像在写同步操作的流程。

    Promise是对象,也是一个构造函数。

    function f1(resolve, reject) {
      // 异步代码...
    }
    
    var p1 = new Promise(f1);
    

    Promise的设计思想是,异步任务返回一个Promise实例,Promise实例有个then方法,用来指定下一步的回调函数。

    Promise实例有三种状态,分别是:

    异步操作未完成(pending)
    异步操作成功(fulfilled)
    异步操作失败(rejected)
    
    fulfilled和rejected合在一起称为resolved(已定型)
    
    异步操作成功,Promise 实例传回一个值(value),状态变为fulfilled。
    异步操作失败,Promise 实例抛出一个错误(error),状态变为rejected。
    
    var promise = new Promise(function (resolve, reject) {
      // ...
    
      if (/* 异步操作成功 */){
        resolve(value);
      } else { /* 异步操作失败 */
        reject(new Error());
      }
    });
    
    
    • resolve函数的作用是,将Promise实例的状态从“未完成”变为“成功”(即从pending变为fulfilled),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去。reject函数的作用是,将Promise实例的状态从“未完成”变为“失败”(即从pending变为rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

    Promise.then()

    Promise 实例的then方法,用来添加回调函数。

    then方法可以接受两个回调函数,第一个是异步操作成功时(变为fulfilled状态)时的回调函数,第二个是异步操作失败(变为rejected)时的回调函数(该参数可以省略)。一旦状态改变,就调用相应的回调函数。

    var p1 = new Promise(function (resolve, reject) {
      resolve('成功');
    });
    p1.then(console.log, console.error);
    // "成功"
    
    var p2 = new Promise(function (resolve, reject) {
      reject(new Error('失败'));
    });
    p2.then(console.log, console.error);
    // Error: 失败
    
    
    

    上面代码中,p1和p2都是Promise 实例,它们的then方法绑定两个回调函数:成功时的回调函数console.log,失败时的回调函数console.error(可以省略)。p1的状态变为成功,p2的状态变为失败,对应的回调函数会收到异步操作传回的值,然后在控制台输出。

    分析以下promise不同写法下的不同结果

    f1().then(function () {
      return f2();
    }).then(f3);   //f3回调函数的参数,是f2函数的运行结果。
    
    
    f1().then(function () {
      f2();
      return;
    }).then(f3);  //f3回调函数的参数是undefined。
    
    f1().then(f2())
      .then(f3);  //f3回调函数的参数,是f2函数返回的函数的运行结果。
    
    
    f1().then(f2)
      .then(f3);  //f2会接收到f1()返回的结果。
    
    

    图片加载

    我们把图片的加载写成一个Promise对象:

    var a = function () {
        return new Promise(function (resolve, reject){
          var image = new Image()
          image.onload = resolve
          image.onerror = reject
          image.src = path 
        })
    }
    
    
    

    相关文章

      网友评论

          本文标题:Promise--异步的解决方案

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