2016-05-13 6 views
0

Я пытаюсь выполнить следующий код:Ожидание на обещание решить, прежде чем функция возвращает значение

exports.myFunction = function(){ 
    myPromise.doThis().then(ret => { 
    return ret; 
    }); 
} 

При вызове этой функции она возвращает undefined. Как заставить функцию ждать обещания, а затем вернуться.

+0

вы не можете. вы можете дать ему только обратный вызов и вызвать этот обратный вызов из вызова 'then', или вы вернете другое обещание. –

+1

В Javascript вы не можете« дождаться »завершения операции async перед возвратом из вашей функции. Это просто не работает. Вместо этого вы возвращаете обещание и позволяете вызывающему абоненту использовать '.then()' на нем, чтобы знать, когда результат будет готов. – jfriend00

+1

BTW, '.then (ret => {return ret;});' is (почти) no-op. –

ответ

1

Будучи асинхронным, нет гарантии узнать, когда обещание будет разрешено. Возможно, вам придется подождать некоторое время (в зависимости от того, что вы делаете).

Типичный способ продолжения исполнения после обещания заключается в выполнении цепочки или использовании функций обратного вызова.

Как Обратный звонок

Ваш пример кода (для меня) предполагает использование обратного вызова.

exports.myFunction = function(callback){ 
    myPromise.doThis().then(ret => { 
     callback(ret); 
    }); 
} 

Затем с помощью будет выглядеть аналогично:

var myFunction = require('pathToFile').myFunction; 

myFunction(function(ret){ 
    //Do what's required with ret here 
}); 

Edit:

Как @torazaburo упоминалось, функция может быть сжата в:

exports.myFunction = function(callback){ 
    myPromise.doThis().then(callback); 
} 

As a Promise

exports.myFunction = function(){ 
    //Returnes a promise 
    return myPromise.doThis(); 
} 

Затем с помощью будет выглядеть так:

var myFunction = require('pathToFile').myFunction; 

myFunction().then(function(ret){ 
    //Do what's required with ret here 
}); 
+0

Спасибо, это имеет смысл. – Simar

+2

* Разрешено полностью * Обещания не разрешают немного. Они либо не разрешены, либо разрешены. Кроме того, ваша смесь обещаний и обратных вызовов довольно странная. BTW, сказать '.then (ret => {callback (ret);})' (почему ненужные фигурные скобки?) (Почти) идентичны выражению '.then (callback)'. Но зачем писать функцию, единственной целью которой является создание асинхронного вызова и зависание 'then' от него, вызывающего указанный обратный вызов? Вместо этого пусть вызывающий абонент сам укажет 'then'. –

+0

Это правда, они либо решены, либо нет. Я пересмотрю свой ответ, чтобы удалить это для ясности. Вы также можете использовать функцию 'callback' как прямую замену, удалив ненужное присвоение' ret'. В качестве примера я специально выбрал вербальный метод. Сжатые нотации могут часто оставлять новых разработчиков в недоумении. – AXRS

Смежные вопросы