我正在努力了解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
我期待相反的顺序。我明白为什么会这样,他们都排队等候并按“反向”顺序完成。
但问题是,我认为第二次没有被执行,直到第一次完成,依此类推。我错过了什么?
答案 0 :(得分:3)
如果你这样写,那么当你写这行时,对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));
答案 1 :(得分:0)
不是有拼写错误吗?你应该将then部分链接到doStuff调用,也许是这样的:
doStuff(1, 3000).then(function(){
doStuff(2, 2000).then(function(){
doStuff(3, 1000);
});
});
答案 2 :(得分:0)
javascript中的超时是异步的。现在你编写它的方式,所有三个promise都按顺序执行,而timeout函数只是将其中的代码排队,在一段时间后运行。超时的执行并不意味着它的解决方案;当内部代码排队时,它被认为是“完成”。这就是为什么第二和第三个承诺不必等待“console.log(”now“+ num);”在被开除之前执行。
有关js中异步任务的一些背景,请参阅此答案https://stackoverflow.com/a/19626821/2782404。