美文网首页
promise用法

promise用法

作者: 二荣xxx | 来源:发表于2021-07-04 22:40 被阅读0次

    一、基本用法

    生成promise实例

    const promise1 = function(){
      return new Promise((resolve,reject)=>{
        if('成功'){
           resolve('成功结果') 
        }else{
          reject('失败结果')
        }
      })
    }
    // promise返回一个新的promise可以用then链式调用
    

    注意:resolve和reject都只接受一个参数
    promise对象有两种变化状态,pending-resolved或pending-reject(promise状态变化后就固定了),resolve的作用是将promise从待定变为成功(pending-resolved),并在异步操作成功时调用,并将异步操作的结果作为参数传递出去;reject是在异步操作抛出错误时调用,并将错误信息作为参数传递出去

    二、promise.then

    Promise 实例具有then方法,也就是说,then方法是定义在原型对象Promise.prototype上的。promise异步操作返回一个全新的promise实例,可以链式调用then方法,promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。

    promise1.then(
      (value)=>{console.log(vlue)}, //成功
      (error)=>{console.log(error)} //失败
    ).then((value)=>{}) //value是上一个promise实例操作成功的结果
    

      // 阮一峰promise例子
        function timeout(ms) {
          return new Promise((resolve) => {
            setTimeout(resolve, ms, "done"); // done 是resolve的参数
          });
        }
        timeout(2000)
          .then((value) => {
            console.log(value); //done 
        })
    

    三、Promise.prototype.catch()

    ES规定异步操作不能用try/catch捕获错误,promise在原型上定义了个catch方法,可以用来链式的捕获错误

    Promise.prototype.catch()方法是.then(null, rejection)或.then(undefined, rejection)的别名,用于指定发生错误时的回调函数。

    const promise3 = new Promise(() => {
          throw new Error("test");
        });
        promise3
          .then(() => {
            console.log("hihihi"); // 不执行
          })
          .catch((error) => {
            console.log(error);
        });
      // 一个promise执行后只有resolve和reject两种状态,状态一旦改变就不再变化
      //所以成功的log不执行
    

    promise对象的错误具有冒泡性质,发生的错误信息回向下传递,直到被下一个catch捕获

    四、Promise.prototype.finally()

    finally 方法用于指定不管 Promise 对象最后状态如何都会执行finally,finally不接受参数,finally与前面的执行状态无关,不依赖前面的执行结果

        const promise4 = new Promise((resolve, reject) => {
          console.log(x + 1);
        });
        promise4
          .then(() => {
            console.log("你好");
          })
          .catch((err) => {
            console.log(err);
          })
          .finally(() => {
            console.log("finally");
          });
          // finally
    

    finally方法总是会返回原来的值。(前一个实例的结果)

    五、Promise.all()

    Promise.all()接受多个promise:p1,p2,p3,包装成一个新promise,只有当p1,p2,p3全部为fulfilled(成功),这个新的promise才会是fulfilled(成功)此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。,只要有一个为reject,这个新的promise就是reject

    const p = Promise.all([p1, p2, p3]);
    
    const promises = [2, 3, 5, 7, 11, 13].map(function (id) {
      return getJSON('/post/' + id + ".json");
    });
    
    Promise.all(promises).then(function (posts) {
      // ...
    }).catch(function(reason){
      // ...
    });
    

    Promise.all()方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例,如果不是,就会先调用Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。另外,Promise.all()方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。

    六、Promise.race()

    Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。率先返回的promise的状态就是新promise的状态,最先改变的promise的返回值传给p的回调函数。

    const p = Promise.race([p1, p2, p3]);
    
    const promises = [2, 3, 5, 7, 11, 13].map(function (id) {
      return getJSON('/post/' + id + ".json");
    });
    
    Promise.race(promises).then((posts) =>{}).catch((reason)=>{});
    

    七、Promise.any()

    Promise.any()方法也是接受一组promise作为参数,包装成一个新promise对象,只要有一个参数实例是成功状态,那新promise就是成功状态,参数实例全为rejected状态新promise才为rejected状态。(和Promise.all()类似于且和或的关系

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

    可以用此方法捕获错误

    Promise.any(promises).then(
      (first) => {
        // Any of the promises was fulfilled.
      },
      (error) => {
        // All of the promises were rejected.
      }
    );
    

    相关文章

      网友评论

          本文标题:promise用法

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