Чего не хватает в вашем примере:
- Я не вижу никакой логики зацикливания в примере, вызывающем функцию
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
массивов.