Promise是一个对象,用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的API,可供进一步处理。
Promise对象有以下两个特点:
1、对象的状态不受外部影响。Promise对象代表一个异步操作,有3种状态:Pending(进行中)、Resolved(已完成)、Rejected(已失败)。只有异步操作的结果才可以决定当前是哪种状态,任何其他操作都无法改变这个状态。这也是“Promise”这个名字的由来。
2、一旦状态改变就不会再变,任何时候都可以得到这个结果。
var promise = new Promise(function(resolve, reject){
//some code
if(/*异步操作成功*/){
resolve(value);
} else {
reject(err)
}
});
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由JavaScript引擎提供,不用自己部署。
resolve的作用是,将Promise对象的状态从“Pending”变为“Resolved”,在异步操作成功时调用,并<b>将异步操作的结果作为参数传递出去;</b>
reject的作用是,将Promise对象的状态从“Pending”变为“Rejected”,在异步操作失败时调用,并<b>将异步操作报的错误作为参数传递出去;</b>
Promise实例生成以后,可以用then方法分别指定Resolved状态和Rejected状态的回调函数。then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为Resolved时调用,第二个回调函数是Promise对象的状态变为Rejected时调用。其中,第二个函数是可选的,不一定要成功。这两个函数都接受Promise对象传出的值作为参数。
function timeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms , 'done');//经测试,第三个参数及后面的参数会被当做resolve函数的参数。
});
}
timeout(100).then((value) => {
console.log(value);
});
<b>如果调用resolve函数和reject函数时带有参数,那么这些参数会被传递给回调函数</b>
上述代码中,timeout方法返回一个Promise实例,表示一段时间以后才会发生的结果。过了指定时间以后,执行resolve函数,将Promise对象从pending改为Resolved,状态变为Resolved会调用then方法里的第一个回调函数。同样,如果将setTimeout里的第一个参数改为resolve的话,Promise对象从pending变为Rejected,状态变为Rejected会调用then方法里的第二个回调函数。