21

При использовании простого обратного вызова, например, как в приведенном ниже примере:Как «ждать» возврата для возврата?

test() { 
    api.on('someEvent', function(response) { 
    return response; 
    }); 
} 

Как функция будет изменена для использования асинхронной/Await? В частности, предполагая, что «someEvent» гарантированно будет вызываться один раз и только один раз, я хотел тест функции, чтобы быть функцией асинхронной, которая не возвращается до обратного вызова не выполняется, например, как:

async test() { 
    return await api.on('someEvent'); 
} 
+0

Для справки, спецификация ES7/ES2016 on был завершен, и он не включает async/wait. На данный момент это всего лишь предложение [этап 3] (https://github.com/tc39/ecma262#current-proposals). –

+0

Ну, это удивительно - Очень надеюсь, что он включится! Спасибо за информацию @DanPrince – sean2078

+1

Тот факт, что ES2015 и ES6 - одно и то же, может создать путаницу, но следует отметить, что ES7 не является взаимозаменяемым с ES2016. ES2016 - завершенный факт. ES7 - это WIP. – estus

ответ

37

async/await не магия. Асинхронная функция - это функция, которая может развернуть обещания для вас, поэтому вам понадобится api.on(), чтобы вернуть обещание для этого. Что-то вроде этого:

function apiOn(event) { 
    return new Promise(resolve => { 
    api.on(event, response => resolve(response)); 
    }); 
} 

Тогда

async function test() { 
    return await apiOn('someEvent'); // await is actually optional here 
             // you'd return a Promise either way. 
} 

Но это тоже ложь, потому что асинхронные функции также возвращают Обещания себя, так что вы не собираетесь на самом деле получить значение из test() , а скорее обещание стоимости, которое вы можете использовать следующим образом:

async function whatever() { 
    // snip 
    const response = await test(); 
    // use response here 
    // snip 
} 
+1

Мне не повезло, что я пытался редактировать, но в функции 'test()' есть ошибка. Он должен возвращать 'await apiOn ('someEvent')', а не 'await api.on ('someEvent')'. Функция 'test()' предназначена для вызова вновь созданной оболочки обещаний вокруг 'api.on', не вызывающей ее напрямую. – kylethebaker

+0

этот ответ спас мой день! – karthikeayan

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