2014-09-29 98 views
1

我試着去了解諾言。但在這裏我很困惑。 我想要創建一個測試功能,在3秒後打印3000,然後在2秒後打印2000,然後在1秒後打印1000。這裏是我的代碼:有人可以爲我解釋下面的代碼嗎?

'use strict'; 
var Q = require('q'); 

function delayConsole(timeOut) { 
    var defer = Q.defer(); 
    setTimeout(function(){ 
     console.log(timeOut); 
     defer.resolve(2000); 
    },timeOut); 
    return defer.promise; 
} 

// This works 
delayConsole(3000).then(function(){ 
    return delayConsole(2000); 
}).then(function(){ 
    return delayConsole(1000); 
    }); 

// This doesn't work. Why? 
delayConsole(3000).then(delayConsole(2000)).then(delayConsole(1000)); 

回答

1

在那裏,你調用函數delayConsole立刻道:

.then(delayConsole(2000)) 

那就是:你不通過該功能,但功能調用的結果,你不等待承諾被鎖定。

當你

then(function(){ 
    return delayConsole(2000); 
}) 

那麼你傳遞一個函數,而不是函數調用的結果。該函數可以在promise鏈中的前一個元素被解析時調用。

+2

可能值得一提的是Q帶有'.delay'功能。 – 2014-09-29 08:40:41

+0

這解釋了很多。謝謝 – eeandrew 2014-09-29 08:41:44

0

我只是想我會分享,你可以做這項工程的,有時它是更容易使用:

promise.then(delayConsole(3000)).then(delayConsole(2000)).then(delayConsole(1000)); 

通過改變delayConsole()這樣:

function delayConsole(timeOut) { 
    return function() { 
     var defer = Q.defer(); 
     setTimeout(function(){ 
      console.log(timeOut); 
      defer.resolve(2000); 
     },timeOut); 
     return defer.promise; 
    } 
} 

因此,呼叫delayConsole()只是捕獲超時參數並返回一個函數,該函數稍後可以由承諾.then處理程序調用。因此,您仍然將函數引用傳遞給.then()處理程序,該處理程序允許承諾引擎稍後調用內部函數,而不是現在執行它。

+0

謝謝jfriend00。你們很棒! – eeandrew 2014-09-30 02:56:43

相關問題