Подтвердить что ты не робот

Подождите, пока задача async завершится

Я взаимодействую со сторонней библиотекой JavaScript, где некоторые вызовы функций асинхронны. Вместо того, чтобы работать с асинхронной логикой в ​​моем приложении, я предпочел написать синхронные обертки для этих асинхронных вызовов. Я знаю, я знаю, это ужасный дизайн, но это демонстрационный проект с очень высоким шансом полностью переписываться. Мне нужно что-то, чтобы показать команде концепцию, а не действительно беспокоиться о производительности.

Вот что я хочу сделать:

function sync_call(input) {
    var value;

    // Assume the async call always succeed
    async_call(input, function(result) {value = result;} );

    return value;
}

Я попробовал jQuery отложить и пообещать, но, похоже, он нацелен на шаблон асинхронного дизайна. Я хочу использовать синхронный шаблон в моем коде.

4b9b3361

Ответ 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);
    } );
}