我有一个功能,
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'错误。
答案 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));