关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出

1.Promise 基础知识梳理

  创建一个Promise实例

const promise = new Promise(function(resolve, reject) {
    if (success){
    resolve(value);
  } else {
    reject(error);
  }
});

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,JavaScript 引擎提供,不用自己部署。

Promise实例生成以后,可以使用then方法分别制定resolved状态和rejected状态的回调函数。

promise.then(value => {}, error => {})

then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例)。因此可以采用链式写法,即then方法后面再调用另一个then方法。

fetch("/posts.json").then(file=> {file.json()}).then(data => {});

上面的代码使用then方法,依次指定了两个回调函数。第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。

Promise.all方法用于将多个Promise实例包装成一个新的实例。

const p = Promise.all([p1, p2, p3]);

上面代码中,Promise.all方法接受一个数组作为参数,p1,p2,p3都是 Promise 实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为Promise实例,再进一步处理。

p的状态由p1,p2,p3决定,分成两种情况。

(1)只有p1,p2,p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1,p2,p3的返回值组成一个数组,传递给p的回调函数。

(2)只要p1,p2,p3之中有一个被rejected,p的状态就变成rejected,此时第一个被rejected的实例的返回值,会传递给p的回调函数。

Promise.race方法也是用于将多个Promise实例包装成一个新的实例。

const p = Promise.race([p1, p2, p3]);

上面代码中,只要p1,p2,p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。

Promise.resolve()将现有对象转为 Promise 对象。

2. 一道关于Promise的应用示例

const timeout = ms => new Promise((resolve) => {
    setTimeout(() => {
      resolve();
    }, ms)
  });

  const ajax1 = () => timeout(1000).then(() => {
    console.log('1')
    return 1;
  });

  const ajax2 = () => timeout(1000).then(() => {
    console.log('2')
    return 2
  });

  const ajax3 = () => timeout(1000).then(() => {
    console.log('3')
    return 3
  });

  const mergePromise = ajaxArray => {
    let result = []
    let promise = Promise.resolve()
    ajaxArray.forEach(function (item) {
      promise = promise.then(item)
      result.push(promise)
    })
    return Promise.all(result)
  };

  mergePromise([ajax1, ajax2, ajax3]).then(data => {
    console.log('done')
    console.log(data) //[1,2,3]
  });

按顺序合并Promise,并将返回结果以数组的形式输出。

posted @ 2018-07-19 19:47  DoubleCorner  阅读(3413)  评论(0编辑  收藏  举报