使用q库通过nodejs中的promise返回值

时间:2015-11-02 21:28:55

标签: node.js q

var a = [0,1,2,3];

如何将getVal的值传递给prod和tst。

    function startFunc(){
     var deferred = Q.resolve();

     var a = [0,1,2,3];
     a.forEach(function (num, i) {
       var getVal = num;
       deferred = deferred
          .then(function(num){
            var def = Q.defer();
            console.log("\n\niteration:"+i + " a: "+getVal);
            return def.resolve(getVal);
          }).then(prod)
          .then(tst)
          .then(compare)
          .catch(function(error){
            console.log(error);
          });
      });

      return deferred.promise;
    }

这是一个nodejs小提琴链接。转到链接并执行按shift + enter to exec。 https://tonicdev.com/pratikgala/5637ca07a6dfbf0c0043d7f9

当执行此操作时,我想将getVal的值传递给prod作为承诺。

我该怎么做。当我运行以下函数时,getVal不会退回到prod。

1 个答案:

答案 0 :(得分:0)

您可以显着简化循环,停止使用延迟反模式并将val传递给prod(),如下所示:

function startFunc() {
    var a = [0, 1, 2, 3];
    return a.reduce(function(p, val, i) {
        return p.then(function() {
            return prod(val);
        }).then(test).then(compare).catch(function (error) {
            console.log(error);
        });
    }, Q());
}    

startFunc().then(function(finalVal) {
    // completed successfully here
}, function(err) {
    // error here
});

这是为了迭代数组中的项目,将每个项目传递给prod()并在数组中的每个项目上运行一系列promise,一个接一个地使得整个承诺链为数组中的第一项在数组中的下一项开始处理之前结束。最终值将是一个promise,它将解析为.reduce()循环返回的最后一步。如果您希望累积一组返回值,也可以这样做。

仅供参考,您可以阅读有关避免延迟反模式here的信息。