为什么在没有参数的情况下,promise.then仍然传递第一个值而不是undefined?

3
考虑以下代码:

var p = new Promise(function(resolve, reject) {
    setTimeout(function() {
        resolve("OK");
    }, 1000);
});

p.then().then(function(data) {
    console.log(data);
});

它输出"OK"。

我不明白在第一个then被调用后发生了什么。当第一个then被调用时,它返回undefined,然后解析为为此then创建的promise的值undefined

然而,由于某种原因,当第二个then被调用时,它将"OK"作为data传递,并随后记录它。这个"data"是从哪里来的?


1
查看 Chromium V8 的 Promise source,当 then 函数没有提供解析函数时,会使用默认函数。该函数只是返回传递给 then 的任意值。在此情况下为 "OK" - fubar
5
"当第一个then被调用时,它返回的是undefined":不,这可能是误解。.then()总是返回一个Promise。如果它返回了undefined,你就无法链式地添加另一个then() - trincot
2个回答

6
这个“转发”值的行为是有意的。Mozilla贡献者写道:
参数
onFulfilled 可选
当此 Promise 被实现时,要异步执行的函数。 [...]
如果它不是一个函数,它会在内部被替换为一个恒等函数 ((x) => x),它只是将实现的值向前传递。

-1
当第一个.then()被调用时,它实际上返回一个带有PromiseResult为"OK"的promise对象。

Promise object returned from each then call

当你在参数中使用回调函数链式调用另一个.then,该回调函数已经可以访问前一个Promise的"OK"时。

你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接