QZ ЛОТОК ДЛЯ ПЕЧАТИ ЗАКАЗ НЕ В ПОСЛЕДОВ. - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь распечатать qz лоток из JavaScript.У меня есть штрих-код с номером в порядке возрастания 1,2,3,4, 5 и так далее.Я зациклил seq правильно.но при распечатке все было не в порядке.

    setTimeout("directPrint2()",1000);

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}

function directPrint2(){
  var data;
  var xhttp;
  var v_carton = "' || x_str_carton ||'";       
  var carton_arr = v_carton.split('','');                                                                                                        
  var v1 =  "' ||
replace(x_zebra_printer_id, '\', '|') ||
'".replace(/\|/g,"\\");
  if(v1 == ""){
      alert("Please setup ZPL Printer");
  }
  else{                                                   
      xhttp=new XMLHttpRequest();
      xhttp.onreadystatechange = function() {
          if (this.readyState == 4 && this.status == 200) {
              data = [ toNative(this.responseText) ];
              printZPL(data, v1);
          }
      };

     for (var j = 0; j < carton_arr.length; j++){                                                         

      var url = "' || x_wms_url ||
'WWW_URL.direct_print_label?in_carton_no="+toValidStr(carton_arr[j]);

      xhttp.open("GET", url, false);                                                                                                       
      xhttp.send();   
      sleep(5000);                                                                                                             
    }  
  }               
};

',
'javascript'

1 Ответ

0 голосов
/ 17 января 2019

Чего не хватает в вашем примере:

  • Я не вижу никакой логики зацикливания в примере, вызывающем функцию printZPL,
  • printZPL не является лотком QZфункция, и вы пропустите фрагмент кода, который он вызывает.Обычно это qz.print(config, data);.

Независимо от отсутствующей информации, API qz.print(...) основывается на ES6 / Promise / A +, что означает , если вы хотите вызвать qz.print несколько раз вСтрока, вам нужно использовать метод Promise-совместимый.(например, .then(...) синтаксис) между вызовами на печать, как описано в руководстве Chaining Requests .

Чтобы избежать этого, вы можете объединить все данные ZPL в одну большую dataмассив.Будьте осторожны, чтобы не спулировать слишком много данных одновременно .

Если вы точно знаете, сколько вакансий вы будете добавлять, вы можете жестко закодировать цепочку обещаний:

qz.websocket.connect()
.then(function() { 
   return qz.printers.find("zebra");              // Pass the printer name into the next Promise
})
.then(function(printer) {
   var config = qz.configs.create(printer);       // Create a default config for the found printer
   var data = ['^XA^FO50,50^ADN,36,20^FDRAW ZPL EXAMPLE^FS^XZ'];   // Raw ZPL
   return qz.print(config, data);
})
.catch(function(e) { console.error(e); });

Наконец, если вы НЕ знаете заранее, сколько вызововqz.print(...) Вы можете использовать цикл Promise, как объяснено в руководстве Promise Loop .

function promiseLoop() {
    var data = [
        "^XA\n^FO50,50^ADN,36,20^FDPRINT 1 ^FS\n^XZ\n",
        "^XA\n^FO50,50^ADN,36,20^FDPRINT 2 ^FS\n^XZ\n",
        "^XA\n^FO50,50^ADN,36,20^FDPRINT 3 ^FS\n^XZ\n",
        "^XA\n^FO50,50^ADN,36,20^FDPRINT 4 ^FS\n^XZ\n"
    ];
    var configs = [
        { "printer": "ZDesigner LP2844-Z" },
        { "printer": "ZDesigner LP2844-Z" },
        { "printer": "ZDesigner LP2844-Z" },
        { "printer": "ZDesigner LP2844-Z" }
    ];
    var chain = [];

    for(var i = 0; i < data.length; i++) {
        (function(i_) {
            //setup this chain link
            var link = function() {
                return qz.printers.find(configs[i_].printer).then(function(found) {
                    return qz.print(qz.configs.create(found), [data[i_]]);
                });
            };

            chain.push(link);
        })(i);
        //closure ensures this promise's concept of `i` doesn't change
    }

    //can be .connect or `Promise.resolve()`, etc
    var firstLink = new RSVP.Promise(function(r, e) { r(); });

    var lastLink = null;
    chain.reduce(function(sequence, link) {
        lastLink = sequence.then(link);
        return lastLink;
    }, firstLink);

    //this will be the very last link in the chain
    lastLink.catch(function(err) {
        console.error(err);
    });
}

Примечание: Петля Promise больше не нужна в QZ Tray2.1.Вместо этого, начиная с версии 2.1, вместо .

может быть предоставлен массив config объектов и data массивов.
...