我使用promise来处理异步方法app = QtGui.QApplication(sys.argv)
mainWin = ImageViewerWindow(result) #ImageViewerWindow inherits from QtGui.QMainWindow
mainWin.show()
app.exec_()
,但我无法从getPropoalByPeriod
函数中获取obj
数据foo
打印未定义。请帮助我们在外面获取数据,以便我可以处理它们。
console.log(89,foo(mycallback()))
此问题与SO上的内容不同。它使用map(),我无法弄清楚如何应用await与promise或async / await的简单示例相比。
答案 0 :(得分:1)
then
接受一个函数,并将Promise
的结果发送给该函数(callback
函数的第一个参数)。
Promise本质上是异步的,它们的输出不是立即可用的。这就是为什么我们使用then
方法来获得结果。
在您的代码中,mycallback
会收到所有Promises的结果,而值res
(与值85
一起打印)是您从promises中获得的。< / p>
请记住,因为您在promises数组中使用了Promise.all
,所以您可以从所有成功的promise中获得一系列结果。这意味着res
是一个数组,而不是单个值。
您的代码遇到其他一些问题。第一次调用foo
方法是好的,并正确打印结果。但是,您的第二个电话(console.log(89,foo(mycallback()))
)不正确,因为您将foo
的调用结果传递给callback()
,而不是将函数传递给undefined
。 foo
功能。删除该行,一切都应该正常工作。
以下是完整的修订代码:
function foo() {
var MyPromises = periods.map((p) => {
return new Promise((resolve, reject) => {
myFunctions.getPropoalByPeriod(p.id, localStart, function(err, rows) {
if (err) {
console.log(62, err);
reject(err);
} else {
var obj = {
id: p.id,
name: p.name,
savedServices: rows[0] ? rows[0].services : '',
};
resolve(obj);
}
});
});
});
return Promise.all(MyPromises);
}
// Pure promises:
foo().then(r => console.log(r));
// or using async/await:
async function run() {
console.log(await foo());
}
run();
//
请记住,使用promises的目的是让你免于使用回调。因此,无需将回调传递给foo
。
您可以使用.then
或await
来检索Promise
的值。您只能在异步函数中使用await
;所以你不能在全局得分中使用await
,你必须定义一个函数,然后调用它。因此,在您的情况下,使用.then
会更容易。