我在使用node.js从db获取restaurantname时遇到问题,似乎它必须使用回调参数做一些事情,但我找不到我的案例的解决方案,希望你们中的一个可以帮助我。
我已经创建了一个从数据库中获取餐馆名称的函数。第一个控制台日志行给出正确的retvalue,第二个给出undefined,我如何编写代码以便返回值是餐馆的名称?
亲切的问候,罗伯特
function restaurantName(id) {
var retvalue;
try {
F.model('restaurant').load(id).then(function (restaurant) {
retvalue = restaurant.Name;
console.log('restaurantName 1(' + id + ')' + retvalue);
})
} catch (err) {
retvalue = 'Error';
}
console.log('restaurantName 2(' + id + ')' + retvalue);
return retvalue;
};
答案 0 :(得分:5)
从数据库获取数据的函数是异步的,因此第二个console.log
以及return
语句在数据库操作完成执行之前完成。您应该返回.then()
function restaurantName(id) {
var retvalue;
return F.model('restaurant').load(id).then(function (restaurant) {
retvalue = restaurant.Name;
console.log('restaurantName 1(' + id + ')' + retvalue);
return retvalue;
}).catch(function(error){
return 'Error';
});
};
此函数也将返回promise
,因此你必须像那样调用它
restaurantName(1).then(function(result){
console.log(result); // result would be retValue or 'Error'
});
修改强>
在这个答案下面的评论中提到的第二个问题也与承诺如何运作有关。在这种情况下,我建议您使用Promise.all
方法,该方法在作为参数传递的所有promise将解析时解析
let promises = [];
snapshot.forEach(u => {
let item = u.val();
item.key = u.key;
promises.push(restaurantName(item.restaurant).then(function(result){
item.restaurantName = result;
return item;
}));
});
Promise.all(promises).then(result => {
console.log(result); // here you get array of items
});
这里发生的是你创建一个使用给定值解析的promises数组(在这种情况下每次都是item
个对象)。当您将此数组传递给Promise.all
方法时,它会解析为每个承诺解析为的值数组(如果当然没有错误发生)