有人可以为我解释下面的代码吗?

我正在努力去理解诺言。 但在这里我很困惑。 我想创build一个3秒钟后打印3000的testing函数,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)); 

在那里,你立即调用函数delayConsole

 .then(delayConsole(2000)) 

那就是:你不传递函数,而是函数调用的结果,你不要等待承诺被链接。

当你这样做

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

那么你传递一个函数,而不是那个函数调用的结果。 可以调用promise链中前一个元素的函数。

我只是以为我会分享,你可以使这个有时更容易使用的build设工作:

 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()捕获timeout参数,并返回一个函数,该函数稍后可以由promise .then处理程序调用。 所以,你仍然将一个函数引用传递给.then()处理函数,它允许promise引擎稍后调用内部函数,而不是现在执行它。