Решения с несколькими обещаниями в JQuery - PullRequest
0 голосов
/ 25 октября 2018

У меня есть этот запрос многократного обещания, который должен быть разрешен перед продолжением следующего набора запросов.

Если длина 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();

}

1 Ответ

0 голосов
/ 25 октября 2018

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