从 setTimeout 做出承诺时感到困惑

Confused when make a promise from setTimeout

我是 Promise 的新手。我写了两个例子:

第一个是:

new RSVP.Promise(function (resolve, reject) {
    setTimeout(function () {
        resolve("HI")
    }, 3000);
}).then(function (result) {
    console.log(result);
});

如我所料,这将在 3 秒后打印出 "HI"。这是因为 "then" 等待它,并且仅在 promise 结算时调用。

第二个是:

new RSVP.Promise(function (resolve, reject) {
    resolve();
}).then(function () {
    return RSVP.Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve("HI")
        }, 3000);
    });
}).then(function (result) {
    console.log(result);
});

我以为它也会在 3 秒后打印 "HI"。但什么也没发生。我认为第二个 "then" 会等待第一个 "then" 中的承诺。

第二个示例有什么问题以及如何解决?

tl;dr

您需要使用 new 运算符构建 RSVP 承诺。

固定码

new RSVP.Promise(function (resolve, reject) {
    resolve();
}).then(function () {
    // Note the `new` in the next line
    return new RSVP.Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve("HI")
        }, 3000);
    });
}).then(function (result) {
    console.log(result);
}).catch(console.error);

在你的例子中,它没有做任何事情,因为 then 处理程序中的承诺创建失败,因为 new 没有与它一起使用。由于 then 处理程序抛出异常,它返回了一个失败的承诺。这就是下一个 then 处理程序也未执行的原因。

当我在附加 catch 处理程序的情况下执行您的原始代码时,如上所示,出现以下错误。

[TypeError: Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.]

经验法则:在处理承诺时始终使用 catch 处理程序。

在您的第二个示例中,您有一个函数 returns 在 then() 函数内有一个承诺,但该承诺不会暴露给 then() 过程,因此当它解析时,没有任何操作它来执行。 then() 实际上 returns 它是自己的承诺,允许链接工作。对于第二个示例,第二个 then() 中的结果应该是您在第一个 then()

中返回的 Promise