Promise使用
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)
上一篇: Win10如何把D盘空间分给C盘|Win10硬盘分成多个分区
下一篇: Promise使用