我对承诺不太熟悉。 我想隐藏promise-call中的promise-implementation。
示例:
function findFriends(req, res) {
const promiseFriend = MyFriendes.find({}).exec(); //call promise
if(friends.length===0){
logger.warn('No friendsavailible');
}else if(friends === undefined){
res.status(500).json({
error: 'INTERNAL ERROR'
});
}else{
res.status(200).json({
friends: friends
});
}
}
我会在同一档案中解决我的承诺但不会 在相同的功能,我称之为承诺。
promiseFriend
.then(function(friends){
return friends;
})
.catch(function(err){
logger.error({error:err});
});
现在,我知道,“promiseFriend”未定义。 我怎样才能将promise-call与promise-resolution分开?
答案 0 :(得分:3)
如果你想在一个函数中定义一个promise并在其他地方使用它,那么首先你需要从该函数返回promise,而你在代码中没有这样做。然后你需要实际调用你也没做的那个函数。最后,您需要对返回的值使用then
回调,在这种情况下您也不会这样做。
在作用于此函数的局部变量promiseFriend
中保存promise是没有意义的。在then
回调中返回值也没有意义:.then(function (friends) { return friends; })
- 我不知道在这里尝试过什么。
我认为findFriends
应该是Express的路由处理程序。如果是这样,请确保在每种情况下都发送回复(您不会对friends.length===0
执行此操作)。此外,如果您希望在解决后采取行动,则需要在保存的承诺中添加then
处理程序。现在你甚至没有在你的功能中定义friends
。还要添加catch
处理程序,并发送针对该案例的响应。
然后你可以从你的函数返回promise,但如果它是一个路由处理程序则不然,它没有意义。您可以从函数返回承诺:
function x() {
return MyFriendes.find({}).exec();
}
然后使用它:
x().then(friends => ...).catch(error => ...);
但是如果你不返回它就不能使用返回值,你不能像定义它们一样使用未定义的变量,而你实际上需要考虑返回的返回值是谁。
我建议您了解Node实际上是如何工作的,因为您似乎已经复制并粘贴了一些随机代码,将它们连接在一起并期望它能够实现您想要的而不会真正理解它。
为了更好地理解在此处执行此执行顺序的Node的异步性,请参阅以下答案:
在理解函数调用,返回值,回调以及在这种情况下的promises之前,不要尝试编写Node程序。