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

2023-12-04

I think Promise.resolve and new 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”。

所以我想如果我不需要“拒绝”任何东西。我可以写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();这里?这两个可以互换吗?


首先也是最重要的

我认为 Promise.resolve 和 new Promise(resolve) 是可以互换的。

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


在最后一个例子中,

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

意味着,您正在返回的结果setTimeout函数,而不是 Promise 对象。所以,当前then处理程序将返回一个已解决的承诺,其结果为setTimeout。这就是为什么你会看到一个奇怪的物体。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Promise.resolve 和 new Promise(resolve) 可以互换吗 的相关文章

随机推荐