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);
});