Попытка преобразовать вложенный обратный вызов Braintree в асинхронный / ожидающий синтаксис NodeJS - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь преобразовать этот вложенный обратный вызов Braintree в async / await:

  var stream = gateway.transaction.search(function (search) {
    search.customerId().is(braintreeCustomerId);
  }, function (err, response) {
    response.each(function (err, transaction) {
      console.log(transaction);
    });
  });

Я пробовал этот подход, но получаю undefined ответ:

  await gateway.transaction.search(async (search) => {
    const response = await search.customerId().is(braintreeCustomerId);
    console.log(response)
  })

Чтоя делаю не так?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Обещание поможет вам только с последним асинхронным обратным вызовом результата, а не предикатом.

const response = await gateway.transaction.search(function (search) {
  search.customerId().is(braintreeCustomerId);
});
response.each(function (err, transaction) {
  console.log(transaction);
});

Это предполагает, что transaction.search уже поддерживает обещания.Если нет, вам нужно будет дать ему обещание .

0 голосов
/ 01 февраля 2019

async функции, как правило, не должны использоваться с API, которые не знают об обещании, потому что это приводит к безудержным обещаниям, которые не объединены в цепочку.

Если gateway.transaction.search не поддерживает обещания, ему нужнычтобы быть обещанным:

const search = util.promisify(gateway.transaction.search).bind(gateway.transaction);

const searchResult = await search();
const response = searchResult.customerId().is(braintreeCustomerId);

Если searchResult.customerId().is(braintreeCustomerId) не возвращает обещание, его не нужно await изд.

...