首页 > 解决方案 > JQuery中的多个承诺解决

问题描述

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

如果 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();

}

标签: javascriptjquerypromisechainingresolve

解决方案


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);
}


推荐阅读