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

时间:2014-09-29 08:33:07

标签: javascript node.js promise q

我正在努力了解Promise。但在这里我很困惑。 我想创建一个测试功能,将在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));

2 个答案:

答案 0 :(得分:1)

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

.then(delayConsole(2000))

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

当你这样做时

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

然后传递一个函数,而不是该函数调用的结果。当promise链中的前一个元素被解决时,可以调用该函数。

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