如何设置失败的承诺值



我正在使用一个打印工具,我试图找到打印机如下

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

如果您不确定是否使用asyncawait,请参阅这个问题:如何以及何时使用' async '和' await '

下面是使用qz-tray和promises的分步教程:https://www.youtube.com/watch?v=wKIY4gqkIFE

警告,asyncawait关键字不兼容ie浏览器。

相关内容

最新更新