2015-10-21 93 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中異步任務的一些背景知識。