【问题标题】:Javascript Q Promise Sequence Order with Arguments带参数的 Javascript Q Promise 序列顺序
【发布时间】:2016-01-22 06:26:26
【问题描述】:

我正在使用 Q 序列 (Nodejs),如 here 所述

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

我试过了:

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

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

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

【问题讨论】:

    标签: javascript node.js promise q


    【解决方案1】:

    问题出在这里:

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

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

    编辑:

    试试这样的:

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

    【讨论】:

    • 有道理,但仍然给出错误的顺序(第一,第四,第三,第二)。有什么想法吗?
    • @Charlie,刚刚在我的示例中添加了一些 console.log 调用和一些解释。请查看
    • 您需要从异步函数返回承诺 - 包括您传递给 then 的回调。我希望你不介意我生硬的编辑,随时回滚它
    • 你也知道为什么需要function(){return...}吗? sampleAsyncCall 不是已经是“承诺返回函数”了吗?
    猜你喜欢
    • 2013-08-25
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多