QZ托盘打印顺序不在SEQ中

时间:2018-12-06 05:18:24

标签: qz-tray

我正在尝试从javascript打印qz托盘。 我有条形码,其编号按1、2、3、4、5的升序排列,依此类推。 我正确地循环序列。但是当打印出来时,它不整齐。

    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 :(得分:0)

您的示例缺少什么:

  • 在调用printZPL函数的示例中,我看不到任何循环逻辑,
  • printZPL不是QZ任务栏功能,您缺少它调用的代码段。通常是qz.print(config, data);

不管缺少什么信息,qz.print(...) API都是基于ES6 / Promise / A +的。如果您要连续多次调用qz.print,则需要使用与Promise兼容的技术。 (例如.then(...)语法),如Chaining Requests指南中所述。

为避免这种情况,可以将所有ZPL数据连接到一个大的data数组中。注意不要spool too much data at once

如果您确切知道要添加多少作业,则可以对承诺链进行硬编码:

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 Loop指南中的说明使用Promise循环。

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

注意:QZ纸盒2.1中不再需要Promise Loop。相反,从2.1开始,是array of config objects and data arrays can be provided instead

相关问题