Важно понимать, что async/await
и обещания одинаковы , только разный синтаксис.
Так что каждая асинхронная функция возвращает обещание !
при условии, что у вас есть функция, повторяющая обещание:
function foo() {
return new Promise(resolve => setTimeout(() => resolve("done"), 1000));
}
есть два способа использования значения.
Стиль обещания:
function test() {
foo().then(value => console.log(value));
}
илиasync await:
async function test() {
const value = await foo();
console.log(value);
}
Теперь важно понимать, что ваша оригинальная callToolsPromise
функция не в стиле обещания. при работе с обещаниями вы никогда не звоните new Promise
. По сути, вся идея new Promise
состоит в том, чтобы преобразовать асинхронный не обещающий код (и, следовательно, не асинхронный / ожидающий, как тот же самый) в Обещания (и так же асинхронный / ожидающий).
Сейчас асинхронный означает не async/await
, а более общую концепцию. Другим распространенным способом обработки асинхронности являются обратные вызовы.
Таким образом, tool.on('exit', (code) => {
является асинхронным , но не обещание или асинхронность / ожидание.
Итак, перенос new Promise
в основном используется для преобразования этого в функцию стиля Promise, которую можно использовать как Promise или с async / await.
последнее слово об этом фрагменте:
for await (const data of tool.stdout) {
return data
}
этонемного проблематично. Хотя потоки узлов являются асинхронными генераторами, они возвращаются после первого фрагмента и прерываются, как только поток получает несколько фрагментов. Поэтому вы должны либо заменить return
на yield
и вернуть асинхронный генератор, либо объединить буферы с циклом и return
после завершения цикла.