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

时间:2017-02-16 15:12:48

标签: javascript node.js promise

我在使用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;
};

1 个答案:

答案 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方法时,它会解析为每个承诺解析为的值数组(如果当然没有错误发生)