【问题标题】:Multiple promise resolve in JQueryJQuery中的多个承诺解决
【发布时间】:2018-10-25 16:57:40
【问题描述】:

我有这个多重承诺请求,需要在继续下一组请求之前解决。

如果 printItemList 长度为 1,则可以正常工作。但是当它超过 2 个时,问题就开始发生了。

这个想法是在成功解决之前的 print_label 后触发 print_label。现在它会立即被解雇,而不是等待之前的请求完成。

这里有什么我做错了吗。

对此的任何帮助将不胜感激。

function print_batch(printItemList){

    var chain = $.when();
    var arr = [];
    for(var batch_size = 0; batch_size < printItemList.length; batch_size ++){

        (function(i){
            chain = chain.then(function() {
                $.when.apply($, arr).done(function(){
                    arr = print_label(printItemList[i]);
                });
            });
        })(batch_size);

    }
}

function print_label(selectedRow) {

    var d = $.Deferred();
    var chain = $.when();
    var arr = [];
    var request = buildLabel(selectedRow);
    var noOfLabel = parseInt(selectedRow.labelCount);

    var url = 'API_URL';
    var epos = new epson.ePOSPrint(url);

    for (var count = 0; count < noOfLabel; count++) {

        (function(i){
            chain = chain.then(function() {

                var def = sendRequest(selectedRow, epos, request);
                arr.push(def);
                return def;
            });
        })(count);

    }
    return arr;

}

function sendRequest(selectedRow, epos, request){
    var deferred = $.Deferred();

    epos.send(request);

    epos.onreceive = function(res) {

        return deferred.resolve(res);
    }
    epos.onerror = function(err) {

        return deferred.reject();
    }
    return deferred.promise();

}

【问题讨论】:

  • 您正在调用 when.apply 多次,每次迭代一次。执行 when.apply 并不会阻止将来的 when.apply 异步运行。
  • 但是我仍然需要确保在一批迭代中是否解决了多个 print_labels,对吧?
  • 我无法完全满足您的整个程序化需求。我只是指出一个逻辑缺陷。
  • 对不起,我不清楚。目标是在另一个 print_label 开始之前完成每个 print_label。但是,每个 print_label 都有多个要打印的标签。这就是我从 print_label 返回一系列承诺的原因。
  • 永远不要使用done,始终使用then。也不要忘记return then 回调中的承诺,否则不会有任何链接。

标签: javascript jquery promise chaining resolve


【解决方案1】:

function print_batch(printItemList){
  //create recursive method
  function print_next_label(index) {
    //if we have not reached the end of the list, do more work
    if (index < printItemList.length) {
      //call the method, wait for all the promises to finish
      $.when.apply($, print_label(printItemList[index])).done(function(){
        //now that they are done, try to print the next label
        print_next_label(++index);
      });
    }
  }
  
  //start the recursive method loop with index 0
  print_next_label(0);
}

【讨论】:

  • 感谢 Taplar。这令人印象深刻。我只是想知道,如果我们有更深的异步请求,我们如何确保每个请求都能正确解析并按顺序运行。只是一个想法。
  • 更深是什么意思?鉴于异步处理的性质,如果要强制执行订单,则必须遵循这样的模式。仅在上一步完成后执行下一步,通过使用单个 promise 回调或使用 $.when 就像您在这里等待批处理完成后再开始下一个批处理。
  • 这是有道理的。我的意思是,一个承诺正在等待另一个完成,依此类推。这发生在一个循环中。
  • 好的,所以这里要记住的一点是,正常循环通常不适用于异步行为,因为您试图将过程逻辑与非过程逻辑混合。根据我的经验,递归循环通常更适合异步范式。
  • 谢谢。这对我将来真的很有帮助
猜你喜欢
  • 2016-12-23
  • 2015-04-16
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 2018-10-02
  • 1970-01-01
相关资源
最近更新 更多