如何从承诺中获得价值。然后|回调返回undefined

时间:2018-03-21 10:19:58

标签: javascript node.js asynchronous promise

我使用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的简单示例相比。

1 个答案:

答案 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(),而不是将函数传递给undefinedfoo功能。删除该行,一切都应该正常工作。

以下是完整的修订代码:

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

您可以使用.thenawait来检索Promise的值。您只能在异步函数中使用await;所以你不能在全局得分中使用await,你必须定义一个函数,然后调用它。因此,在您的情况下,使用.then会更容易。