问题描述
我正在使用一个打印工具,我尝试在其中查找打印机,如下所示
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
}
所以当上面运行时,它找到一台打印机 this.Printers 有一个值。 这是正确的
this.Printers = "Found a printer"
但是当我找不到打印机时,这台打印机看起来像
Promise {<pending>}__proto__: Promise[[PromiseState]]: "pending"[[PromiseResult]]: undefined
所以在我的 catch i tried
中分配 this.Printers=null
作为测试,看看它是否返回,但我仍然没有得到
Promise {<pending>}__proto__: Promise[[PromiseState]]: "pending"[[PromiseResult]]: undefined
当它失败使用 [[PromiseResult]]: undefined 或 null 时,我如何分配 this.Printers?
解决方法
引用@ivar
您似乎误解了 Promise 和异步流程的工作原理
我同意这个说法,但更进一步,你在做一些非常奇怪的事情,你在它自己的函数中重新定义一个变量。
在某些语言中,例如 Visual Basic,it's normal to use function assignment as a return variable,但这在 JavaScript 中是不正常的。
此外,promise 中的 return
关键字将值传递给下一个 promise,它不会退出函数!
您的代码应该如下所示:
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
,请参阅此问题:How and when to use ‘async’ and ‘await’
这是使用 qz-tray 和 promises 的分步教程:https://www.youtube.com/watch?v=wKIY4gqkIFE
警告,async
和 await
关键字与 Internet Explorer 不兼容。