如何使用使用promises的函数的结果

时间:2016-12-14 22:15:19

标签: node.js mongoose promise es6-promise

我有一个功能,

  asdf() {
    var a = fooController.getOrCreateFooByBar(param);
    console.log("tryna do thing");
    console.log(a); //undefined
    if (!a.property) {
      //blah
    }

死了。 getOrCreateFooByBar做了

  Model.find({phoneNumber : number}).exec()
  .then(function(users) {})

找到或创建模型,最后返回它:

.then(function(foo) { return foo}

如何在asdf()中使用此结果?我觉得这是一个相当容易的问题,但我陷入困境。如果我尝试执行a.exec()或a.then(),我会得到'a not a read of undefined'错误。

1 个答案:

答案 0 :(得分:2)

Promises的主要思想(与传递的回调相反)是它们是你可以传递并返回的实际对象。

fooController.getOrCreateFooByBar需要返回它从Model.find()获得的Promise(在完成所有处理之后)。然后,您就可以在a函数的asdf中访问它了。

反过来,asdf() 也应返回一个Promise,这也会使asdf()成为可能。只要你继续从异步函数返回Promises,就可以继续链接它们。

// mock, you should use the real one
const Model = { find() { return Promise.resolve('foo'); } }; 

function badExample() {
  Model.find().then(value => doStuff(value));
}

function goodExample() {
  return Model.find().then(value => doStuff(value));
}

function asdf() {
  var a = badExample();
  var b = goodExample();

  // a.then(whatever); // error, a is undefined because badExample doesn't return anything

  return b.then(whatever); // works, and asdf can be chained because it returns a promise!
}

asdf().then(valueAfterWhatever => doStuff(valueAfterWhatever));