2014-09-29 101 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

相关问题