欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Promise使用

程序员文章站 2022-07-03 09:33:44
...

Promise,简单的说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

Promise对象有以下两个特点:

1.对象的状态不受外界的影响,Promise代表一个异步操作,有三种状态,分别是Pending(进行中)、Fulfilled(已成功)、Rejected(已失败)。异步操作的结果决定了当前是哪种状态,任何其他操作都不能改变这个状态。

2.一旦状态改变就不会再变,Promise状态的改变只有两种可能,从Pending变为Fulfilled和从Pending变为Rejected,只要这两种情况发生,状态就凝固了,不会再改变。

有了Promise对象就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。

基本语法

Promise对象是一个构造函数,用来生成Promise实例。

var promise = new Promise(function(resolve,reject){
//......some code
if(/*异步操作成功*/){
      resolve(value)
    }else{
      reject(error)
    }
});

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和rejected,它们是两个函数,由JavaScript引擎提供,不用自己部署。resolve函数的作用是将Promise对象的状态从“未完成”变成“成功”,在异步操作成功的时候调用,并将异步操作的结果作为参数传递出去;reject函数的作用是将Promise对象的状态从“未完成”变成“失败”,在异步操作失败时调用,并将异步操作时报出我的错误作为参数传递出去。
Promise实例生成以后,可以使用then方法分别指定Resolved状态和Rejected状态的回调函数。

promise.then(function(value){
      //成功
},function(error){
      //失败
});

then方法的两个回调函数,第一个回调函数是在Promise对象的状态变为Resolved时调用,第二个回调函数是在Promise对象的状态变为Rejected时调用。其中第二个函数是可选的,不一定提供。这两个函数都接受Promise对象传出的值作为参数。
下面是一个Promise对象的简单例子:

function timeout(ms){
      return new Promise((resolve,reject)=>{
          setTimeout(resolve,ms,'done') ;
      });   
}
timeout(100).then((value)=>{
        console.log(value);
});

上面的代码中,timeout方法返回一个Promise实例,是在指定ms秒之后,Promise实例的状态表为Resolved时,就会触发then方法绑定的回调函数。
Promise创建之后就会立即执行:

let promise = new Promise(function(resolve,reject){
      console.log('promise');
      resolve();
});
promise.then(function(){
      console.log('Resolved');
});
console.log('Hi!');

如果调用resolve函数和reject函数时带有参数,那么这些参数会被传递给回调函数,reject函数的参数通常是Error对象的实例,表示抛出的错误;resolve函数的参数除了正常的值之外,还可能是另一个promise实例。
有时候需要将现有对象转化为Promise对象,Promise.resolve方法就起到这个作用。

var jsPromise = Promise.resolve($.ajax('/whatever.json'));

Promise.reject(reason) 方法也返回一个新的Promise实例,状态为Rejected。
Promise.reject()方法的参数会原封不动地作为后续方法的参数。

[宏任务和微任务] (https://www.cnblogs.com/wangziye/p/9566454.html