从 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
我是 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