无法理解 MDN 文档中带有 Promise.prototype.then() 的注释

Car*_*arr 1 javascript node.js promise

我正在学习将我的 Node.js 代码风格从回调转换为承诺,这似乎是一种趋势,并且有很多优点。为了防止误解承诺的要点和好处,我正在阅读 MDN 上的文档。我可以理解此页面中的示例,但我不清楚文档开头提到的注释

注意:...如果第一个参数被省略或提供了一个非函数,则创建的新 Promise 只会采用随后被调用的 Promise 的履行状态(如果它已履行)。如果第二个参数被省略或提供了一个非函数,则创建的新 Promise 只会采用随后被调用的 Promise 的拒绝状态(如果它被拒绝)。

如果这是微不足道的,请提前抱歉。希望能举例说明,谢谢。

Joe*_*lay 5

编辑:更新以更好地匹配规范 - 请参阅此处此处

.then方法调用两个函数之一,这取决于它所附加的 Promise 是否已完成或被拒绝。然后它根据该调用的结果返回一个新的 Promise。这允许您根据 Promise 是否成功运行不同的逻辑,并且可以轻松地将 Promise 链接在一起。

但是,如果您决定不传入其中一个函数,它会使用合理的默认值 - 这就是您发布的注释所暗示的。不过,演示可能比描述容易得多!


如果您省略onRejected回调,如下所示:

myPromise.then(function (value) {
    console.log("success!");
});
Run Code Online (Sandbox Code Playgroud)

结果与这样做相同:

myPromise.then(function (value) {
    console.log("success!");
}, function (reason) {
    throw reason;
});
Run Code Online (Sandbox Code Playgroud)

如果您省略onFulfilled回调,如下所示:

myPromise.then(null, function (reason) {
    console.log("fail!");
});
Run Code Online (Sandbox Code Playgroud)

结果是一样的:

myPromise.then(function (value) {
    return value; // the same as returning Promise.resolve(value)
}, function (reason) {
    console.log("fail!");
});
Run Code Online (Sandbox Code Playgroud)

如果您将两者都排除在外……这基本上毫无意义,但仍然:

myPromise.then();
Run Code Online (Sandbox Code Playgroud)

这实际上与以下内容相同:

myPromise.then(function (value) {
    return value;
}, function (reason) {
    throw reason;
});
Run Code Online (Sandbox Code Playgroud)

反过来,基本上只是:

myPromise
Run Code Online (Sandbox Code Playgroud)