2015-10-21 42 views
0

我试图了解es6的承诺。据我了解,它们可以被链接在一起执行。它不起作用。ES6中的顺序承诺JavaScript无法正常工作

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

您必须将函数传递给'.then',而不是承诺。 –

回答

3

如果你这样写,那么当你写这条线时,将开始3个电话doStuff。你必须把它写这样的:

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)); 
+0

如果你在做ES6,箭头功能更短。 – loganfsmyth

+0

哦,你是对的,我会加上一个例子 – Magus

0

没有一个错字?您应该将当时的部分链接到doStuff调用,可能是这样的:

doStuff(1, 3000).then(function(){ 
    doStuff(2, 2000).then(function(){ 
     doStuff(3, 1000); 
    }); 
}); 
0

javascript中的超时是异步的。现在你写它的方式,所有三个承诺都按顺序执行,并且超时功能只是将它内部的代码排队以在一段时间后运行。超时的执行并不意味着它的解决方案;当它的内部代码排队时,它被认为是“完成”的。这就是为什么第二个和第三个承诺不必等待行“console.log(”now“+ num);”在被踢出之前执行。

看到这个问题https://stackoverflow.com/a/19626821/2782404了解js中异步任务的一些背景知识。