Как я могу дождаться результата асинхронной функции с q.js в другом обработчике событий?

У меня есть следующий обработчик событий Javascript:

 function eventHandler(e) {
        //doSomething 1...

        asyncFunctionWhichReturnPromise(data).then(function (data) {
              //doSomething 2...
              e.data = {
                  Id: data.Id,
                  Type: "Type" 
              };
        });
        //doSomething 3...
 }

Поэтому, когда я запускаю код, "//doSomething 3..." выполняется перед "//doSomething 2...", но поскольку это функция обработчика событий, мне нужно подготовить данные в "//doSomething 2..." блок кода до того, как будет вызвано следующее событие. Как я могу сделать это с помощью q.js (библиотека обещаний Криса Ковала)?

Важная дополнительная информация: на самом деле мне нужно, чтобы блок //doSomething 2... выполнялся перед выходом из обработчика событий, потому что есть инициализация e.data, которая будет использоваться на следующем шаге - загрузка kendo ui загрузит данные на сервере.


person Vitach    schedule 16.04.2015    source источник
comment
Вы абсолютно не можете. doSomething2 всегда выполняется асинхронно, после того как управление покинуло обработчик событий. Вам нужно будет найти способ заставить ждать загрузки пользовательского интерфейса кендо.   -  person Bergi    schedule 16.04.2015


Ответы (1)


Просто переместите код doSomething 3... внутрь функции обратного вызова.

 function eventHandler(e) {
        //doSomething 1...

        asyncFunctionWhichReturnPromise(data).then(function (data) {
              //doSomething 2...

              //doSomething 3...
        });
 }

Если вы хотите сделать более очевидным, что doSomething 3... должен выполняться после этого, вы можете поместить его внутрь функции.

 function eventHandler(e) {
        //doSomething 1...

        asyncFunctionWhichReturnPromise(data).then(function (data) {
              //doSomething 2...

              doSomething3();
        });

        function doSomething3() {
              //doSomething 3...
        }
 }
person leopik    schedule 16.04.2015
comment
Я так понимаю - //doSomething 2... тоже какая-то асинхронная функция. Если да, то переместите //doSomething 3... в обратный вызов этой функции. - person leopik; 16.04.2015