Подождите, пока задача async завершится
Я взаимодействую со сторонней библиотекой JavaScript, где некоторые вызовы функций асинхронны. Вместо того, чтобы работать с асинхронной логикой в моем приложении, я предпочел написать синхронные обертки для этих асинхронных вызовов. Я знаю, я знаю, это ужасный дизайн, но это демонстрационный проект с очень высоким шансом полностью переписываться. Мне нужно что-то, чтобы показать команде концепцию, а не действительно беспокоиться о производительности.
Вот что я хочу сделать:
function sync_call(input) {
var value;
// Assume the async call always succeed
async_call(input, function(result) {value = result;} );
return value;
}
Я попробовал jQuery отложить и пообещать, но, похоже, он нацелен на шаблон асинхронного дизайна. Я хочу использовать синхронный шаблон в моем коде.
Ответы
Ответ 1
Это никогда не будет работать, потому что JS VM переместилась с этого async_call и вернула значение, которое вы еще не установили.
Не пытайтесь бороться с тем, что является естественным и встроенным в поведение языка. Вы должны использовать технику обратного вызова или обещание.
function f(input, callback) {
var value;
// Assume the async call always succeed
async_call(input, function(result) { callback(result) };
}
Другой вариант - использовать обещание, посмотрите Q. Таким образом вы возвращаете обещание, а затем присоединяете к нему слушателя, который в основном совпадает с обратным вызовом. Когда обещание будет устранено, тогда будет срабатывать.
Ответ 2
Как насчет вызова функции из вашего обратного вызова вместо возврата значения в sync_call()?
function sync_call(input) {
var value;
// Assume the async call always succeed
async_call(input, function(result) {
value = result;
use_value(value);
} );
}