Можно ли переписать все обещания JavaScript для использования async await? - PullRequest
0 голосов
/ 03 ноября 2018

Весь асинхронный / ожидающий код может быть переведен в 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 Ответ

0 голосов
/ 03 ноября 2018

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