Promise

95 阅读2分钟
  1. Promise 的用途

    Promise 是 JS 异步编程的一种解决方案,可以解决异步编程中的回调问题。

    Promise 对象的构造器(constructor)语法如下:

    let promise = new Promise(function(resolve, reject) {
      // executor
    });
    

    当 new Promise 被创建,executor 会自动运行并尝试执行一项工作。尝试结束后,如果成功则调用 resolve,如果出现 error 则调用 reject

  2. 如何创建一个 new Promise

第一步:

  • return new Promise((resolve,reject)=>{...})

  • 任务成功调用resolve(result), 任务失败则调用reject(error)

  • resolve和reject会调用成功函数和失败函数 第二步:

  • 使用 .then(success,fail)传入成功函数和失败函数

  1. 如何使用 Promise.prototype.then

    语法:

    promise.then( 
        function(result) { */* handle a successful result */* }, 
        function(error) { */* handle an error */* } 
    );
    

    .then 的第一个参数是一个函数,该函数将在 promise resolved 后运行并接收结果。

    .then 的第二个参数也是一个函数,该函数将在 promise rejected 后运行并接收 error。

    例,resolve:

    let promise = new Promise(function(resolve, reject) {
      setTimeout(() => resolve("done!"), 1000);
    });
    
    // resolve 运行 .then 中的第一个函数
    promise.then(
      result => alert(result), // 1 秒后显示 "done!"
      error => alert(error) // 不运行
    );
    

    例,reject:

    let promise = new Promise(function(resolve, reject) {
      setTimeout(() => reject(new Error("Whoops!")), 1000);
    });
    
    // reject 运行 .then 中的第二个函数
    promise.then(
      result => alert(result), // 不运行
      error => alert(error) // 1 秒后显示 "Error: Whoops!"
    );
    
  2. 如何使用 Promise.all

    Promise.all 可以用于并行执行多个promise, 并等待所有promise都准备就绪。

    语法: let promise = Promise.all([...promises...]); Promise.all 接受一个 promise 数组作为参数并返回一个新的 promise。

    当所有给定的 promise 都 resolve 时,新的 promise 才会 resolve,并且其结果数组将成为新 promise 的结果。

    例如,下面的 Promise.all 在 3 秒之后 settled,然后它的结果就是一个 [1, 2, 3] 数组。

   Promise.all([
         new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1
         new Promise(resolve => setTimeout(() => resolve(2), 2000)), // 2
         new Promise(resolve => setTimeout(() => resolve(3), 1000))  // 3
       ]).then(alert); 
       // 1,2,3 当上面这些 promise 准备好时:每个 promise 都贡献了数组中的一个元素
  1. 如何使用 Promise.race

与 Promise.all 类似,但只等待第一个 settled 的 promise 并获取其结果(或 error)。

语法:

 let promise = Promise.race(iterable);

这里第一个 promise 最快,所以它变成了结果。第一个 settled 的 promise “赢得了比赛”之后,所有进一步的 result/error 都会被忽略。