Можно ли переписать все обещания 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);
});
Другие вопросы по тегам