Javascript Q Promise Sequence Order with Arguments

Javascript Q Promise Sequence Order with Arguments

我正在按照描述使用 Q 序列 (Nodejs) here

我需要按顺序 return 这些异步调用,即使它们花费的时间不同。我该怎么做?

我试过了:

function sampleAsyncCall(wait,order) {
    var deferred = Q.defer();

    setTimeout(function() {
        console.log(order)
        deferred.resolve();
    }, wait);

    return deferred.promise;
}

sampleAsyncCall(400,"first")
    .then(sampleAsyncCall(300,"second"))
    .then(sampleAsyncCall(200,"third"))
    .then(sampleAsyncCall(100,"forth"));

Returns:
forth
third
second 
first

令人困惑的是,如果我将其重写为不使用参数,它会return按我想要的顺序排列。

function first() {
    var deferred = Q.defer();

    setTimeout(function() {
        console.log("first")
        deferred.resolve();
    }, 400);

    return deferred.promise;
}

function second() {
    var deferred = Q.defer();

    setTimeout(function() {
        console.log("second")
        deferred.resolve();
    }, 300);

    return deferred.promise;
}

function third() {
    var deferred = Q.defer();

    setTimeout(function() {
        console.log("third")
        deferred.resolve();
    }, 200);

    return deferred.promise;
}

function forth() {
    var deferred = Q.defer();

    setTimeout(function() {
        console.log("forth")
        deferred.resolve();
    }, 100);

    return deferred.promise;
}

first().then(second).then(third).then(forth);

Returns:
first
second
third
forth

问题出在这里:

sampleAsyncCall(400,"first")
    .then(sampleAsyncCall(300,"second"))
    .then(sampleAsyncCall(200,"third"))
    .then(sampleAsyncCall(100,"forth"));

.then() 函数应该作为参数接收一个 functionnot a promise(您的函数调用解析为)。

编辑:

尝试这样的事情:

sampleAsyncCall(400,"first")
    .then(function(){
        return sampleAsyncCall(300,"second")
    })
    .then(function(){
        return sampleAsyncCall(200,"third")
    })
    .then(function(){
        return sampleAsyncCall(100,"forth")
    });