Promise.resolve和new Promise(resolve)是可以互换的

我认为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); }); 

这打印别的东西,而不是“嗨”。 那么可以使用RSVP.resolve(); 这里? 这两个是可以互换的吗?

首先和最重要的

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

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


在最后一个例子中,

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

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


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