Чистый интерфейс, который поддерживает Callbacks, Promises и async / await - PullRequest
0 голосов
/ 04 июня 2018

Я нахожусь в процессе создания небольшой библиотеки, которая в значительной степени зависит от асинхронности, и я пытаюсь поддерживать стиль обратного вызова NodeJ, Promises и async / await с минимальным дублированием функционального кода.

Итак,в качестве примера возьмем следующее (не имеет значения, что он делает)

class Someclass{
  constructor(){}

  asyncMethod(someData, cb){
    var commonVar = ''
    if (cb) { // ******* Callback Requested
      doSomething()
      var result=usingCallbacks()
      if (!result) cb('Error')
      cb(null, result)
    } else{ // ******** we should use a promise
      return new Promise((resolve,reject) => {
        doSomething()
        var result=usingPromises()
        if (!result) reject(err)
        resolve(result)
      })
    }
  }
}

Так что я застрял на том, как построить здесь асинхронную / awit-часть.Есть идеи?

1 Ответ

0 голосов
/ 04 июня 2018

Больше ничего не требуется, поскольку await может ожидать все, что возвращает Promise (или что-то похожее на обещание).

Другими словами, это должно "просто работать":

async useLibFn() {
  await someclass.asyncMethod('foo');
}

Под прикрытием async / await являются просто синтаксическим сахаром для обещаний.

  • async заставляет функцию всегда возвращатьобещаю.В основном эквивалентно:

    function someFn() {
      return new Promise(function(resolve, reject) {
        try {
          // actual fn body
        } catch (ex) {
          reject(ex);
        }
      });
    }
    
  • await принимает некоторое выражение и разрешает его асинхронно.Если значение обещает, оно ожидает разрешения (звонки then()).В противном случае он разрешается со значением на следующем тике.В основном эквивалентно:

    Promise.resolve(rval).then(...)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...