Я использую библиотеку TWIT для nodejs, которые имеют асинхронные вызовы, и я сделал такие функции, как это:Лучшего способ возврата значений из функций в асинхронных JavaScript
function getUserFromSearch(phrase) {
T.get('search/tweets', { q: phrase+' lang:pt', count: 1 }, function(err, data, response) {
data['statuses'].forEach(function(element) {
var result = "maybe";
say('getting user profile from search for '+phrase, result);
console.log(element);
return element['user']['screen_name'];
}, this);
})
}
С T.get() выполняется asynchonously всякий раз, когда я
var username = getUserFromSearch('banana');
я получаю username=undefined
, потому что это занимает много времени, чтобы вернуть вещи. Очевидным решением было бы реализовать функцию обратного вызова, как это:
function getUserFromSearch(phrase, callback) {
T.get('search/tweets', { q: phrase+' lang:pt', count: 1 }, function(err, data, response) {
data['statuses'].forEach(function(element) {
var result = "maybe";
say('getting user profile from search for '+phrase, result);
console.log(element);
callback(element['user']['screen_name']);
}, this);
})
}
Но я не думаю, что это лучшее решение, потому что мне нужно создать функцию обратного вызова только для этого. Не существует способа передать имя пользователя «pointer» следующим образом: getUserFromSearch('banana', username);
таким образом, что функция изменяет значение имени пользователя? Есть ли еще лучший способ?
Могу ли я использовать синтаксис ES2015 в nodejs? – Gatonito
@ Гатонито: Да. Узел v6.x имеет полную поддержку, отличную от модулей (и оптимизацию хвостового вызова, если вы не используете флаг). v5.x и v4.x имели частичную поддержку. –
Затем вы можете использовать его следующим образом: 'var username = await getUserFromSearch (фраза);' однажды узел поддерживает ['async' /' await'] (https://developers.google.com/web/fundamentals/getting-started/праймеры/асинхронное-функция). – jib