我正在使用一个打印工具,我试图找到打印机如下
this.Printers = qz.websocket.connect().then(() => {
return qzTray.printers.find("found a printer");
}).then((found) => {
this.Printers = found;
return this.Printers;
}).catch((e) => {
console.log('failed printing');
this.Printers=null;
return this.printers
}
所以当上面运行时,它找到一个打印机。printer的值为。哪个是正确的
this.Printers = "Found a printer"
但是当我找不到打印机的时候。打印机看起来像
Promise {<pending>}__proto__: Promise[[PromiseState]]: "pending"[[PromiseResult]]: undefined
所以在我的catchi tried
中将this.Printers=null
赋值为一个测试来看看它是否返回了结果但是没有我仍然得到
Promise {<pending>}__proto__: Promise[[PromiseState]]: "pending"[[PromiseResult]]: undefined
如何赋值。失败时的打印机使用[[PromiseResult]]: undefined或null?
引用@ivar
你似乎误解了Promises和异步流是如何工作的
我同意这个说法,但是更进一步说,你在做一些非常奇怪的事情,你在它自己的函数中重新定义了一个变量。
在某些语言中,例如Visual Basic,使用函数赋值是正常的作为返回变量,但这在JavaScript中不正常。
此外,承诺中的return
关键字将值传递给下一个承诺,它不会退出一个函数!
var Printers;
qz.websocket.connect().then(() => {
return qz.printers.find();
}).then((found) => {
Printers = found;
}).catch((e) => {
console.log('failed to connect or to find printers');
Printers=null;
}).then(() => {
console.log(Printers);
});
…然而,这可能不是理想的,特别是如果您希望使这个函数调用同步。要使其同步,请尝试这样做:
async function getPrinters() {
if(!qz.websocket.isActive()) {
await qz.websocket.connect();
}
return await qz.printers.find();
}
var Printers;
try {
Printers = await getPrinters();
} catch {
Printers = null;
}
console.log(Printers);
如果您不确定是否使用async
和await
,请参阅这个问题:如何以及何时使用' async '和' await '
下面是使用qz-tray和promises的分步教程:https://www.youtube.com/watch?v=wKIY4gqkIFE
警告,async
和await
关键字不兼容ie浏览器。