Promise.resolve 和 new Promise(resolve) 可以互换吗

Are Promise.resolve and new Promise(resolve) interchangeable

我认为 Promise.resolvenew Promise(resolve) 可以互换。

考虑一下:

A.

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

B.

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

都如我所料打印 "HI"。

所以我想如果我不需要 "reject" 任何东西。为了简单起见,我可以只写 RSVP.resolve();

但是考虑这个例子:

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

如何使用RSVP.resolve();替换?我试过例如:

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

这会打印其他内容而不是 "HI"。那么是否可以使用 RSVP.resolve();这里?这两个可以互换吗?

首要

I think Promise.resolve and new Promise(resolve) are interchangeable.

没有。 Promise.resolve 将创建一个已解决的承诺,而 new Promise(resolve) 将创建一个既未解决也未拒绝的承诺。


在最后一个例子中,

return setTimeout(function () {
    return new RSVP.resolve("HI");
}, 3000);

意味着,您正在 returning setTimeout 函数的结果,而不是 promise 对象。因此,当前 then 处理程序将 return 一个结果为 setTimeout 的已解决承诺。这就是为什么您会看到一个奇怪的对象。


在您的特定情况下,您想在解决承诺之前引入延迟。 Promise.resolve 是不可能的。您在问题中显示的倒数第二个方法就是要走的路。