Как получить результат работы асинхронной функции в Javascript?

Есть одна асинхронная функция. Которая извлекает нечто. Вот так она используется:
getSomeItems(
  function( someItems ) { 
    /someItems - полученное(или получаемое?) нечто
    /тут можно сделать что-то с этим нечто
  }
);

Какими способами можно вернуть "someItems" ?

Ясно, что такая конструкция вернет undefined:
getSomeItems(
  function( someItems ) { 
    return someItems
  }
);


Поправьте меня, если вопрос где-то некорректен.
  • Вопрос задан
  • 3551 просмотр
Решения вопроса 1
max7
@max7
max7
А старый дедовский способ

var mySomeItems = null;
getSomeItems(
  function( someItems ) { 
    mySomeItems = someItems;
  }
);

и где-то
if(mySomeItems)
{
   ...
}


У меня, например, вот так используется "event emitter”:
1. если нельзя изменить функцию getSomeItems
var myME = new ManagerEvents(...); // <-- где-то

myME.on("NewSomeItems", function(event)
{
   var someItems = event.data;
   ...
});

getSomeItems(
  (function( someItems ) 
  { 
    this.emit("NewSomeItems", someItems);
  }).bind(myME)
);

2. если можно изменить функцию getSomeItems
var myME = new ManagerEvents(...); // <-- где-то

myME.on("NewSomeItems", function(event)
{
   var someItems = event.data;
   ...
});

getSomeItems(myME); // просто принимает аргументом ManagerEvents и внутри генерирует событие.

Потом я в свой ManagerEvents добавил функцию (примерно)
ManagerEvents.prototype.delegate = function(name)
{
   var me = this;
   return function()
   {
      return me.emit(name, arguments);
   };
};

и в итоге получается
var myME = new ManagerEvents(...); // <-- где-то

myME.on("NewSomeItems", function(event)
{
   var someItems = event.data[0];
   ...
});

getSomeItems(myME.delegate("NewSomeItems"));
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Просто вернуть - никак, по этой причине колбэк в неё и передаётся. Всю последующую логику придется реализовывать через него.
Можно вернуть Promise.
В будущем можно будет использовать генераторы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы