ES6 JavaScript 中的顺序承诺不起作用
Sequential promises in ES6 JavaScript aren't working
我正在尝试理解 es6 Promises。据我了解,它们可以链接起来按顺序执行。它不适用于个别情况。
console.log("Started");
function doStuff(num, timeout) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log("now " + num);
resolve();
}, timeout);
});
}
doStuff(1, 3000).then(doStuff(2, 2000)).then(doStuff(3, 1000));
然而输出是:
$ node test
Started
now 3
now 2
now 1
我期待相反的顺序。我明白为什么会变成这样,他们都排队并按 "reverse" 顺序完成。
但问题是,我认为第二个直到第一个完成后才执行,依此类推。我错过了什么?
如果你这样写,对doStuff
的3次调用将在你写这行时开始。你必须这样写:
doStuff(1, 3000).then(function() {
return doStuff(2, 2000);
}).then(function() {
return doStuff(3, 3000);
});
正如loganfsmyth所说,你是在做ES6,你也可以使用箭头函数:
doStuff(1, 3000).then(() => doStuff(2, 2000)).then(() => doStuff(3, 3000));
是不是打错了?您应该将 then 部分链接到 doStuff 调用,也许像这样:
doStuff(1, 3000).then(function(){
doStuff(2, 2000).then(function(){
doStuff(3, 1000);
});
});
javascript 中的超时是异步的。按照你现在的写法,所有三个 promise 都是按顺序执行的,超时函数只是在一定时间后将其中的代码排队到 运行。超时的执行并不意味着它的解决;当其内部代码排队时,它被认为是 "done"。这就是为什么第二个和第三个承诺不必等待行 "console.log("now " + num);"在开始之前执行。
有关 js 中异步任务的一些背景知识,请参阅此答案 。
我正在尝试理解 es6 Promises。据我了解,它们可以链接起来按顺序执行。它不适用于个别情况。
console.log("Started");
function doStuff(num, timeout) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log("now " + num);
resolve();
}, timeout);
});
}
doStuff(1, 3000).then(doStuff(2, 2000)).then(doStuff(3, 1000));
然而输出是:
$ node test
Started
now 3
now 2
now 1
我期待相反的顺序。我明白为什么会变成这样,他们都排队并按 "reverse" 顺序完成。
但问题是,我认为第二个直到第一个完成后才执行,依此类推。我错过了什么?
如果你这样写,对doStuff
的3次调用将在你写这行时开始。你必须这样写:
doStuff(1, 3000).then(function() {
return doStuff(2, 2000);
}).then(function() {
return doStuff(3, 3000);
});
正如loganfsmyth所说,你是在做ES6,你也可以使用箭头函数:
doStuff(1, 3000).then(() => doStuff(2, 2000)).then(() => doStuff(3, 3000));
是不是打错了?您应该将 then 部分链接到 doStuff 调用,也许像这样:
doStuff(1, 3000).then(function(){
doStuff(2, 2000).then(function(){
doStuff(3, 1000);
});
});
javascript 中的超时是异步的。按照你现在的写法,所有三个 promise 都是按顺序执行的,超时函数只是在一定时间后将其中的代码排队到 运行。超时的执行并不意味着它的解决;当其内部代码排队时,它被认为是 "done"。这就是为什么第二个和第三个承诺不必等待行 "console.log("now " + num);"在开始之前执行。
有关 js 中异步任务的一些背景知识,请参阅此答案 。