使用 q 库在 NodeJS 中通过 promise 返回值


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("nniteration:"+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 键执行。https://tonicdev.com/pratikgala/5637ca07a6dfbf0c0043d7f9

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

当我运行以下函数时,getVal 不会恢复到生产。

您可以大大简化循环,停止使用延迟反模式,并将 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()并对数组中的每个项目运行承诺链,一个接一个,以便在数组中第一项开始处理之前完成数组中第一项的整个承诺链。 最终值将是一个承诺,它解析为.reduce()循环中返回的任何步骤。 如果您希望累积返回值数组,也可以这样做。

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

最新更新