我一直试图弄清楚这一点,我想知道分辨率值是如何通过getAnswer
then
调用的。首先我return
我认为add
的结果会返回一个承诺,允许我对then
上的then
方法使用getAnswer
调用,但是第二个return
语句如何传递给它?
function add(num1, num2) {
return new Promise((resolve, reject) => {
setTimeout(() => {resolve(num1 + num2);}, 500)
});
}
function getAnswer() {
return add(5, 5).then((res) => {
console.log(res);
return new Promise((resolve, reject) => {
resolve("How does this get passed too getAnswer's then function?");
});
});
}
getAnswer().then((res) => {
console.log(res);
})

答案 0 :(得分:1)
基础:
add
返回一个Promise - 这是Promise
对象的一个实例,Promise
的每个实例都有一个then
方法,您可以用它来观察该承诺分辨率。
出于链接的目的,then
的设计方式是它本身返回一个Promise(因此,JavaScript中的每个then
调用都将返回一个新的promise)。 then
返回的承诺将使用其处理程序的返回值进行解析(稍后将详细介绍)。
现在,当你说:
return add(5, 5).then((res) => {
console.log(res);
return new Promise((resolve, reject) => {
resolve("How does this get passed too getAnswer's then function?");
});
});
您没有返回add
的结果,您通过在then
的结果上调用add
来返回您创建的承诺(这只是标准的JS行为)。
您的问题:
但是第二个return语句是如何传递给它的呢?
以下是then
方法返回的内容,根据MDN(([])
中的部分是我的添加内容):
待处理状态中的承诺([这是您的第一个
return
语句实际返回的内容])。然后处理函数(onFulfilled或onRejected)异步调用([示例中的处理程序是您传递给then
内的getAnswer
]的函数)。在调用处理函数之后,如果处理函数:
- 返回一个值,然后返回的promise将以返回值作为其值进行解析;
- 抛出错误,然后返回的promise将被抛出错误作为其值被拒绝;
- ([这是您的情况 - 您的第二个
return
])返回已经解决的承诺,然后返回的承诺将以该承诺的值作为其值解析;- 返回已经被拒绝的承诺,然后返回的承诺将被拒绝,并将该承诺的值作为其值。
- 返回另一个待处理的promise对象,当时返回的promise的解析/拒绝将在处理程序返回的promise的解析/拒绝之后。此外,then返回的promise的值将与处理程序返回的promise的值相同。
就个人而言,每当我看到then
的处理程序返回Promise时,我只是假设 - 为了简化我的想法 - 最初由then
返回的Promise已经被then
的一个处理程序刚刚返回的Promise所取代。当然,这种心理映射与实际功能AFAIK平行。
所以,总结一下:
getAnswer
返回由add(5, 5).then(...)
创建的承诺。then
(getAnswer().then(...)
)观察返回的承诺 - 此处无关,但此调用也会创建承诺。 add
调用返回的观察承诺的处理程序(此处理程序是您在#1中传递给then
的函数),也会返回一个承诺和规则如果then
的处理程序返回一个承诺p
,那么每当p
使用值v
解析时,原始承诺 - 由then
创建 - 也将通过v
解决。then
以观察getAnswer()
返回的承诺的处理程序将使用#3中的值v
进行调用。<小时/> 请随时要求澄清,但在此之前,请仔细阅读this文章。