2017-02-16 8 views
1

У меня проблема с получением имени ресторана из db с помощью node.js, похоже, что он должен что-то делать с параметрами обратного вызова, но я не могу найти решение для своего дела, надеюсь, один из вы можете мне помочь .Функция 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; 
}; 
+0

Не можете ли вы сохранить второй 'console.log' внутри блока' try' ? –

+0

Вы не обрабатываете случайную ошибку в своей функции обратного вызова. –

+3

Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (Http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call) –

ответ

4

Ваша функция получения данных из базы данных является асинхронным, поэтому второй 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' 
}); 

EDIT

Ваша вторая проблема, упомянутый в комментарии ниже этого ответа, также касается того, как работают обещания. В этом случае я рекомендую использовать Promise.all метод, который решает, когда все обещания, переданные в качестве аргумента рассосется

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 
}); 

Что происходит здесь вы создаете массив обещаний, которые решить с заданным значением (которое в данном случае является item объект каждый раз). Когда вы передаете этот массив методу Promise.all, он разрешает массив значений, которые разрешено каждому единственному обещанию (если, конечно, не происходит никакой ошибки)

+0

Первоначальный вызов функции: item.restaurantName = restaurantName (item.restaurant); Я заменил его: restaurantName (item.restaurant) .then (функция (результат) { console.log ('результат:' + результат); // результат будет retValue или 'Error' item.restaurantName = результат; }); Результатом вызова является Ошибка вместо правильного имени (которое возвращается в функции) – user3493979

+0

Итак, вам нужно сделать 'restaurantName (item.restaurant) .then (function (result) {item.restaurantName = result; }); ' – piotrbienias

+0

Результат вызова по-прежнему не определен ... – user3493979