node.js函数返回未定义的值

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)

pio*_*ias 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';
    });
};
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解析为的值的数组(当然,如果没有错误发生)