【发布时间】:2021-02-12 00:35:20
【问题描述】:
我想一次执行一个函数,并在一个函数完成时调用另一个函数。我能够使用回调但不使用承诺链来做到这一点。 这是我尝试过的(基于https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise#chained_promises),但它同时执行前 3 个函数,而不是在每个函数中等待 1 秒:
function displayAll() {
var myPromise = (new Promise(display1))
.then((new Promise(display2))
.then((new Promise(display3))
.then(display4)));
}
function display1(resolve) {
setTimeout(function () {
console.log("display1");
resolve();
}, 1000);
}
function display2(resolve) {
setTimeout(function () {
console.log("display2");
resolve();
}, 1000);
}
function display3(resolve) {
setTimeout(function () {
console.log("display3");
resolve();
}, 1000);
}
function display4(resolve) {
setTimeout(function () {
console.log("display4");
}, 1000);
}
你知道代码有什么问题吗?是否可以在没有回调的情况下做我想做的事情?
【问题讨论】:
-
将
resolve作为参数传递并不意味着它是一个承诺。您需要将 setTimeouts 包装在一个 Promise 中。 -
这不是真的,
Promise(MDN) 构造函数将function(resolve, reject)作为参数,所以display1函数是一个有效参数 -
这里的主要问题是
.then()要求你向它传递一个函数引用并且你正在向它传递一个promise。这不是您使用.then()的方式,因此您通过它的承诺会被忽略。 IMO,当他们设计 Promise 时,这应该是一个 TypeError,这显然是一个编程错误,但.then()只是忽略了它。相反,您需要传递一个返回您的承诺的函数。这一点非常重要,这样.then()可以在父 Promise 解决时调用您的函数。 -
不幸的是 MDN 把你带到了这个地方。如果您不整天盯着这些东西看,该页面上的代码会非常具有误导性。几乎不可能找到以这种方式编写的生产、非人为的应用程序代码。这是其他评论者的信息。此外,虽然答案有效,但它属于同一类别的人为/不会在狂野的例子中找到。
-
我刚刚向 MDN 提交了这个问题,看看我们是否可以解决这个问题:github.com/mdn/content/issues/2303
标签: javascript promise settimeout