一个 Promise 必然处于以下几种状态之一:
- 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled): 意味着操作成功完成。
- 已拒绝(rejected): 意味着操作失败。
方法
Promise.resolve
1 2 3 4 5 6 7 8
| Promise.resolve("Success").then( function (value) { console.log(value); }, function (value) { } );
|
Promise.reject
1 2 3 4 5 6 7 8
| Promise.reject(new Error("fail")).then( function () { }, function (error) { console.error(error); } );
|
Promise.prototype.then()
1
| p.then(onFulfilled[, onRejected]);
|
示例:
1 2 3 4 5 6 7 8
| p.then( (value) => { }, (reason) => { } );
|
Promise.prototype.catch()
catch() 方法返回一个 Promise,并且处理拒绝的情况。它的行为与调用 Promise.prototype.then(undefined, onRejected) 相同。 (事实上, calling obj.catch(onRejected) 内部 calls obj.then(undefined, onRejected)).
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| p.catch(function (reason) { });
function catchPro() { Promise.resolve() .then(() => { throw new Error("Oh no!"); }) .catch((error) => { console.log("onRejected function called: " + error.message); }) .then(() => { console.log( "I am always called even if the prior then's promise rejects" ); }); }
|
链式调用
then 方法返回一个 Promise 对象,其允许方法链
你可以传递一个匿名函数给 then,并且,如果它返回一个 Promise,一个等价的 Promise 将暴露给后续的方法链。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| function foo() { Promise.resolve("foo") .then(function (string) { return new Promise(function (resolve, reject) { setTimeout(function () { string += "bar"; resolve(string); }, 1); }); })
.then(function (string) { setTimeout(function () { string += "baz"; console.log(string); }, 1); return string; }) .then(function (string) { console.log("then3", string); });
}
|
当一个值只是从一个 then 内部返回时,它将等价地返回 Promise.resolve(<由被调用的处理程序返回的值>)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| function thenToThen() { var p2 = new Promise(function (resolve, reject) { resolve(1); });
p2.then(function (value) { console.log(value); return value + 1; }).then(function (value) { console.log(value + " - A synchronous value works"); });
p2.then(function (value) { console.log(value); });
}
|
如果函数抛出错误或返回一个拒绝的 Promise,则 then 将返回一个拒绝的 Promise
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| function throwToReject() { Promise.resolve() .then(() => { throw new Error("Oh no!"); }) .then( () => { console.log("Not called."); }, (error) => { console.error("onRejected function called: " + error.message); } ) .catch((err) => { console.error("111"); }); }
|
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| new Promise(function (resolve, reject) { resolve("Success"); }) .then(function (value) { console.log("then1", value); throw new Error("fail"); }) .catch(function (e) { console.log("catch1", e.message); throw new Error("catch"); }) .then( function (value) { console.log("then3", value); }, function (err) { console.log("catch2", err.message); } );
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| new Promise(function (resolve, reject) { resolve("Success"); }) .then(function (value) { console.log("then1", value); return value; }) .then( function () { console.log("then23"); }, function (e) { console.log(e.message); throw new Error("catch"); } ) .then( function (value) { console.log(value); }, function () { console.log("catch2", err.message); } );
function p1(data) { return new Promise((resolve, reject) => { resolve(data); }); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| function f1() { p1({ code: 0 }) .then((res) => { return new Promise((resolve, reject) => { if (res.code === 0) { resolve({ ...res, msg: "F1 回调成功" }); } else { return f2(); } }); }) .then((res) => { console.log(res); }) .catch((err) => { console.log(err); }); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function f2() { p1({ code: 20 }) .then((res) => { if (res.code === 0) { return { ...res, msg: "F2 回调成功" }; } else { return Promise.reject({ ...res, msg: "F2 code 错误" }); } }) .then((res) => { console.log(res); }) .catch((err) => { console.log("F2 ", err); }); }
|