【问题标题】:How to resolve a Q deferred object multiple times, i.e. make resolve by steps?如何多次解析 Q 延迟对象,即逐步解析?
【发布时间】:2013-12-30 13:47:18
【问题描述】:

我有一个函数流,其中一个(first 函数)是异步的并返回一个承诺。此函数调用其他异步函数 (nestedAssyncFunction_*)。当第一个函数及其所有嵌套函数返回时,必须调用第二个函数。所以我需要在几个地方解析延迟对象(在三个嵌套函数的例子中)。

var deferred = Q.defer();
first().then(second);

function first() {
    nestedAssyncFunction_1();
    nestedAssyncFunction_2();
    nestedAssyncFunction_3();
    return deferred.promise;
}
function second() {
    // some actions
}

所以我的主要问题是:如何通过几个步骤解决延迟问题

到目前为止,我发现我可以从多个地方调用notify 方法,并在其处理程序内部解析主要的延迟对象。像这样:

var deferred = Q.defer();
deferred.progressCounter = 0;

first().then(second, undefined, notifyHandler);

function notifyHandler() {
    deferred.progressCounter++;
    if (deferred.progressCounter === 3) {
        deferred.resolve();
    }
}
function nestedAssyncFunction_1() {
    // some actions
    deferred.notify();
}

但是我的问题是:将自定义属性添加到延迟对象的最佳方法是什么? 因为它似乎不喜欢这样做,就像上面的例子一样。

感谢。

【问题讨论】:

    标签: javascript asynchronous q


    【解决方案1】:

    这根本不是你想要的。

    你想要什么:

    Q.all([
       nestedAssyncFunction_1(),
       nestedAssyncFunction_2(),
       nestedAssyncFunction_3()
    ]).then(function(){
        //All done
    });
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      function first() {
          //All you nested functions have to return a promise
          var promises = [];
          promises.push(nestedAssyncFunction_1());
          promises.push(nestedAssyncFunction_2());
          promises.push(nestedAssyncFunction_3());
      
          var deferred = Q.defer();
          Q.all(promises).then(function(){
               //do some tasks after all promises are resolve.
      
               deferred.resolve(); //resolve deferred objects when all promises are resolved.
          });
          return deferred.promise;
      }
      
      function second() {
          // some actions
      }
      

      或此解决方案(取决于您的需求,您可以选择此解决方案或第一个解决方案):

      function first() {
              //All you nested functions have to return a promise
              var promises = [];
              promises.push(nestedAssyncFunction_1());
              promises.push(nestedAssyncFunction_2());
              promises.push(nestedAssyncFunction_3());
      
              var deferred = Q.defer();
              promises.push(deferred.promise);//push the promise of current function
      
              //do something asynch with the current function and call deferred.resolve()
      
              return Q.all(promises);//Combine all promises into one
          }
      
          function second() {
              // some actions
          }
      

      像这样链接函数:

      first().then(second);
      

      【讨论】:

        猜你喜欢
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多