对Promises
进行一些研究,我知道Promise
对象可以在三个状态(待处理,解决,被拒绝(。负责这三个状态中每一个的逻辑是在回调函数中,该函数将传递到Promise
构造函数中。此回调函数具有2个函数作为其参数解决和拒绝,当此回调导致成功或失败时被调用。
实例化Promise
后,我们可以通过在其上调用.then
函数将响应处理程序回调添加到承诺中。.then
函数将2个回调函数作为其参数。第一个参数是调用回调函数,以防Promise
Resolve函数被调用,并且在调用Promise
拒绝函数的情况下调用第二个回调。您也可以在Promises
上致电.catch
来处理被拒绝的承诺,尽管这只是句法糖:
.then(undefined, () => { failure callback})
我发现难以理解的是.then
方法返回Promise
的事实。例如,在以下代码中:
示例
let random = (Math.random() * 10);
let promise = new Promise((res, rej) => {
if (random >= 5) {
res(random);
}
rej(random);
});
promise
.then(
(nr) => {
console.log("succes: " + nr);
return nr + 5;
})
.then((nr) => {
console.log(nr);
})
.catch(
(nr) => {
console.log("failure: " + nr);
})
问题:
在第一个.then
的示例中,它返回:nr + 5
。在Promise
的解决情况下,此值将成功地传递到第二个.then
上。这怎么可能?是在引擎盖下:
return new Promise((res,rej) => {
res(nr + 5)
})
还是其他因素引起的?
这是承诺的行为,在此描述
https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/promise/promise/then
返回值部分:
如果处理程序函数返回值,则
then
返回的承诺 通过返回值作为其值解决;
是的,这是承诺的主要特征之一:它们是可链的。
then
方法确实返回了一个新的承诺,该承诺将在回调的结果下解决。它确实确实构建了new Promise
,并在调用回调时确实将resolve
调用。
您可能想查看此玩具实施方式,以查看如何实施(不,没有错误处理(。
看一下:承诺链接
通常,一个由一个。然后立即传递给下一个处理程序的值。但是有一个例外。
如果返回的值是承诺,则将进一步执行暂停直到结算。之后,该诺言的结果将给下一个处理程序。
基本上,当您返回值时,即:(nr + 5) or 5 or [1, 2] or {a: 1}
等。