Можно ли переписать все обещания JavaScript для использования async await?
Весь асинхронный / ожидающий код может быть переведен в Promises или другие конструкции. Потому что это то, что сделали с Вавилоном.
Я предположил, что две парадигмы эквивалентны и что все обещания могут быть переписаны с помощью async/await. Это правда? Или это предположение мне нужно отбросить.
Для конкретного примера у меня есть следующий код, который содержит обещание. Я не видел способа перевести этот код только в async/await.
Для контекста этот код почтового ящика предназначен для демонстрации. Я должен объяснить модель Actor в контексте браузера /JavaScript.
function Mailbox () {
const messages = []
var awaiting = undefined
this.receive = () => {
if (awaiting) { throw 'Mailbox alread has a receiver'}
return new Promise((resolve) => {
if (next = messages.shift()) {
resolve(next)
} else {
awaiting = resolve
}
})
}
this.deliver = async (message) => {
messages.push(message)
if (awaiting) {
awaiting(messages.shift())
awaiting = undefined
}
}
}
1 ответ
async/await
использовать обещания. На самом деле, они не делают ничего полезного, если у вас нет обещания await
, Они не заменяют обещания. Вы бы обычно использовали await
вместо .then()
на обещание.
Давайте посмотрим на простой пример. Предположим, у вас есть две функции, которые возвращают обещания.
function delay(t) {
return new Promise(resolve => {
setTimeout(resolve, t);
});
}
const rp = require('request-promise');
function getData(uri) {
let options = {uri, json: true};
return rp(options);
}
Теперь вы хотите получить данные с трех разных URL с задержкой в 1 секунду между запросами.
Регулярные обещания
С обычными обещаниями (без асинхронного / ожидающего) вы можете сделать что-то вроде этого, используя цепочку обещаний:
function getAllData() {
let result = {};
return getData(firstURL).then(data => {
results.d1 = data;
return delay(1000);
}).then(() => {
return getData(secondURL);
}).then(data => {
results.d2 = data;
return delay(1000);
}).then(() => {
return getData(thirdURL);
}).then(data => {
results.d3 = data;
return results;
});
}
getAllData().then(result => {
console.log(result);
}).catch(err => {
console.log(err);
});
Использование Async/Await
С помощью await
Вы можете упростить последовательность нескольких асинхронных операций, но эти асинхронные операции все еще используют обещания. Вы просто заменяете некоторые цепочки .then()
операции с await
,
async function getAllData() {
let result = {};
result.d1 = await getData(firstURL);
await delay(1000);
result.d2 = await getData(secondURL);
await delay(1000);
result.d3 = await getData(thirdURL);
await delay(1000);
return result;
}
getAllData().then(result => {
console.log(result);
}).catch(err => {
console.log(err);
});