【问题标题】:Are Promise.resolve and new Promise(resolve) interchangeablePromise.resolve 和 new Promise(resolve) 可以互换吗
【发布时间】:2016-03-05 00:31:59
【问题描述】:

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

考虑一下:

一个。

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();这里?这两个可以互换吗?

【问题讨论】:

标签: javascript node.js promise rsvp.js


【解决方案1】:

首先

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

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


在最后一个例子中,

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

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


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

【讨论】:

  • 你能告诉我什么时候最好使用 RSVP.resolve() 吗?
  • @CSnerd 每当您需要创建已解决的承诺时。例如,假设您正在编写一个在互联网上查询给定单词的函数。由于查询是一个异步任务,因此您会从中返回一个 Promise。但是您不想每次都进行查询,因为它非常慢。因此,您将查询结果缓存在 JavaScript 对象中。下次当请求来自相同的关键字时,您需要返回一个 Promise 但带有值,而不是执行异步操作。在这种情况下,你可以简单地做if (k in cache) return Promise.resolve(cache[k])
猜你喜欢
  • 2019-06-20
  • 2018-03-04
  • 2019-08-31
  • 1970-01-01
  • 2019-04-07
  • 2021-01-08
相关资源
最近更新 更多