Promise 本身不是异步,但是内部往往都是封装一个异步任务
Promise 对象用于表示一个异步操作的最终完成 (或失败)及其结果值。
特点
-
一个
Promise
对象代表一个在这个 promise 被创建出来时不一定是已知的值。 -
Promise
让您能够把异步操作最终的成功返回值或者失败原因和相应的处理程序关联起来。这样使得异步方法可以像同步方法那样返回值。 -
异步方法并不会立即返回最终的值,而是会返回一个 promise,以便在未来某个时候把值交给使用者。
一个 Promise 必然处于以下几种状态之一
- 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled): 意味着操作成功完成。
promise
已经被resolved
- 已拒绝(rejected): 意味着操作失败。
promise
已经被rejected
Promise的链式调用
我们可以用 promise.then()
,promise.catch()
和 promise.finally()
这些方法将进一步的操作与一个变为已敲定状态的 promise 关联起来。
doSomething()
.then(function(result) {
return doSomethingElse(result);
})
.then(function(newResult) {
return doThirdThing(newResult);
})
.then(function(finalResult) {
console.log('Got the final result: ' + finalResult);
})
.catch(failureCallback);
复制代码
如果当你知道一个 promise
总是 resolve
或者总是 reject
的时候,你可以写 Promise.resolve
或 Promise.reject
,传入你想要 reject
或 resolve
的 promise
的值。
Promise函数方法
-
Promise()
创建一个新的
Promise
对象。该构造函数主要用于包装还没有添加 promise 支持的函数。 -
Promise.all(iterable)
并行执行多个异步操作,然后在最后一个异步程序结束后,再继续下面的方法。
var p1 = Promise.resolve(3); var p2 = 1337; var p3 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'foo'); }); Promise.all([p1, p2, p3]).then(values => { console.log(values); // [3, 1337, "foo"] }); 复制代码
-
Promise.any(iterable)
Promise.any()
接收一个Promise可迭代对象,只要其中的一个 promise 成功,就返回那个已经成功的 promiseconst pErr = new Promise((resolve, reject) => { reject("总是失败"); }); const pSlow = new Promise((resolve, reject) => { setTimeout(resolve, 500, "最终完成"); }); const pFast = new Promise((resolve, reject) => { setTimeout(resolve, 100, "很快完成"); }); Promise.any([pErr, pSlow, pFast]).then((value) => { console.log(value); // pFast fulfils first }) // 输出: "很快完成" 复制代码
-
Promise.reject(reason)
返回一个状态为失败的Promise对象,并将给定的失败信息传递给对应的处理方法
-
Promise.resolve()
返回一个带着给定值解析过的
Promise
对象,如果参数本身就是一个Promise
对象,则直接返回这个Promise
对象。如果这个值是thenable(即带有”then” 方法),返回的promise会“跟随”这个thenable的对象,采用它的最终状态;否则返回的promise将以此值完成。
Promise.resolve("Success").then(function(value) { console.log(value); // "Success" }, function(value) { // 不会被调用 }); 复制代码