use*_*979 2 javascript node.js promise
我在使用node.js从数据库获取餐厅名称时遇到问题,似乎它必须使用回调参数来做一些事情,但是我找不到适合我情况的解决方案,希望你们中的一个可以帮助我。
我已经设置了从数据库中获取餐厅名称的函数。第一个控制台日志行提供正确的retvalue,第二个控制台日志提供未定义的值,如何编写代码,使返回值成为餐厅名称?
亲切的问候,罗伯特
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;
};
Run Code Online (Sandbox Code Playgroud)
从数据库获取数据的函数是异步的,因此第二个语句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';
});
};
Run Code Online (Sandbox Code Playgroud)
而且此函数还将返回一个promise,因此您必须像这样调用它
restaurantName(1).then(function(result){
console.log(result); // result would be retValue or 'Error'
});
Run Code Online (Sandbox Code Playgroud)
编辑
在此答案下方的评论中提到的第二个问题,也是关于诺言如何工作的问题。在这种情况下,我建议您使用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
});
Run Code Online (Sandbox Code Playgroud)
在这里发生的是您创建了一个按给定值解析的promise数组(在这种情况下,item每次都是对象)。当您将此数组传递给Promise.all方法时,它将解析为每个单个promise解析为的值的数组(当然,如果没有错误发生)
| 归档时间: |
|
| 查看次数: |
1320 次 |
| 最近记录: |