对Promises
进行一些研究,我知道Promise
对象可以处于三种状态(待定,已解决,被拒绝)。负责这三种状态中的每一种的逻辑都在一个回调函数中,该函数被传递到Promise
构造函数中。这个回调函数有两个函数作为其参数resolve和reject,当这个回调导致成功或失败时调用它们。
在实例化Promise
之后,我们可以通过调用其上的.then
函数将响应处理程序回调添加到promise。 .then
函数将2个回调函数作为其参数。第一个参数是在调用Promise
resolve函数时调用回调函数,在调用Promise
拒绝函数的情况下调用第二个回调函数。您也可以在.catch
上调用Promises
来处理被拒绝的承诺,尽管这只是语法糖:
.then(undefined, () => { failure callback})
我发现更难理解的是.then
method returns a 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)
})
或者这是由其他原因引起的?
答案 0 :(得分:3)
这是承诺的行为,在此描述
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then
在返回值部分:
如果处理函数返回一个值,
then
返回的承诺 以返回值作为其值来解析;
答案 1 :(得分:2)
是的,这是major features of promises中的一个:它们是可链接的。
then
方法会返回一个新的承诺,该承诺将使用回调结果解析。它确实构造了一个new Promise
,并在调用回调函数时使用返回值调用resolve
。
您可能需要查看this toy implementation以了解它是如何实现的(尽管没有错误处理)。
答案 2 :(得分:2)
请注意: Promises chaining
通常,.then处理程序返回的值会立即传递给下一个处理程序。但是有一个例外。
如果返回的值是一个promise,则进一步执行将暂停,直到它结束。之后,该承诺的结果将被赋予下一个.then处理程序。
基本上,当你返回一个值,即:(nr + 5) or 5 or [1, 2] or {a: 1}
等时,该值会立即传递给下一个处理程序(.then)。