QZ ЛОТОК ДЛЯ ПЕЧАТИ ЗАКАЗ НЕ В ПОСЛЕДОВ.
Я пытаюсь распечатать 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 ответ
Чего не хватает в вашем примере:
- Я не вижу никакой логики зацикливания в примере, вызывающем
printZPL
функция, printZPL
не является функцией QZ Tray, и вам не хватает фрагмента кода, который он вызывает. Обычно это будетqz.print(config, data);
,
Независимо от недостающей информации, qz.print(...)
API на основе ES6/Promise/A+ означает, если вы хотите позвонить qz.print
Несколько раз подряд вам нужно использовать метод, совместимый с Promise. (например .then(...)
синтаксис) между вызовами на печать, как описано в руководстве по запросам цепочки.
Чтобы избежать этого, вы можете объединить все данные 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 Tray 2.1. Вместо этого, начиная с 2.1, массив config
объекты и data
вместо этого могут быть предоставлены массивы.