Appearance
Promise
js
var promise = new Promise(function (resolve, reject) {
// 异步处理
// 处理结束后、调用resolve 或 reject
});
promise.then(onFulfilled, onRejected);
resolve(成功)时 onFulfilled 会被调用
reject(失败)时 onRejected 会被调用
onFulfilled、onRejected 两个都为可选参数。
被 reject 后的处理,可以在.then 的第二个参数 或者是在 .catch 方法中设置想要调用的函数。
promise.then
成功和失败时都可以使用。 另外在只想对异常进行处理时可以采用 promise.then(undefined, onRejected)
这种方式,只指定 reject 时的回调函数即可。 不过这种情况下 promise.catch(onRejected)
应该是个更好的选择。
TIP
js
promise.then(onFulfilled).catch(onRejected);
只有在上面这种 then 方法中没有 onRejected 参数,才会使promise.catch(onRejected)
被调用的
Promise 的状态
用 new Promise 实例化的 promise 对象有以下三个状态。
“has-resolution” - Fulfilled
resolve(成功)时。此时会调用 onFulfilled
“has-rejection” - Rejected
reject(失败)时。此时会调用 onRejected
“unresolved” - Pending
既不是 resolve 也不是 reject 的状态。也就是 promise 对象刚被创建后的初始化状态等
promise 对象的状态,从 Pending 转换为 Fulfilled 或 Rejected 之后, 这个 promise 对象的状态就不会再发生任何变化。
也就是说,Promise 与 Event 等不同,在.then 后执行的函数可以肯定地说只会被调用一次。
另外,Fulfilled 和 Rejected 这两个中的任一状态都可以表示为 Settled(不变的)。
Settled
resolve(成功) 或 reject(失败)。
关于这个问题,在 Effective JavaScript 的 第67项 不要对异步回调函数进行同步调用 中也有详细介绍。
绝对不能对异步回调函数(即使在数据已经就绪)进行同步调用。
如果对异步回调函数进行同步调用的话,处理顺序可能会与预期不符,可能带来意料之外的后果。
对异步回调函数进行同步调用,还可能导致栈溢出或异常处理错乱等问题。
如果想在将来某时刻调用异步回调函数的话,可以使用 setTimeout 等异步API。