Функция обещает ничего не возвращать после изменения на асинхронный - PullRequest
0 голосов
/ 05 декабря 2018

Я использую библиотеку paypal-node-SDK для звонков в Paypal API.Он использует обещание, подобное этому:

paypal.payment.create(create_payment_json, function (error, payment) {
    if (error) {
        throw error;
    } else {
        console.log("Create Payment Response");
        console.log(payment);
    }
});

Однако я пытаюсь сделать его async, потому что мои другие функции тоже async/await.Но он не возвращает никакого обратного вызова, просто не определено.

        exports.create = wrap(async(req, res) => {
            const payment = await paypal.payment.create(create_payment_json);
        });
        //wrap
        module.exports = (fn) => {
        return (req, res, next) => {
            Promise.resolve(fn(req, res, next))
                .catch((error) => {
                    console.log(error);
                    res.status(400).send({success: false, message: error.message});
                });
            };
        };

Кажется, библиотека поддерживает обещания (функция: ссылка ), но cb(null, response) на самом деле ничего не возвращаеткогда это асинхронная функция.Я что-то пропустил?Есть ли способ заставить его работать асинхронно?

Ответы [ 2 ]

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

Продолжая ответ Коди Дж.

Правильно, что вам нужно перейти на бета-версию v2 +, чтобы использовать обещания в SDK, хотя, если вы хотите это сделать,после обновления вы обнаружите существенные изменения.

Вы можете прочитать полную документацию здесь:

https://github.com/paypal/PayPal-node-SDK/tree/2.0-beta

Также имеется руководство по миграциипереход от v1 к v2:

https://github.com/paypal/PayPal-node-SDK/blob/2.0-beta/docs/Migrating.md

0 голосов
/ 05 декабря 2018

Вам нужна бета / версия 2.0+, чтобы использовать обещания в SDK.

Не знаю точно, какой у вас переход, но для обратных вызовов в стиле узла function foo(a,b,callback) вы можете использовать promisify

    const { promisify } = require('util');
    exports.create = promisify(paypal.payment.create);

Ручное преобразование paypal.payment.create будет

function create(create_payment_json){
  return new Promise(function(resolve,reject){
    paypal.payment.create(create_payment_json,function(error,payment){
      if(error){
       reject(error);
      }else{
       resolve(payment);
      }
    }
  };
}

Который затем может быть использован const payment = await create(json);

Тогда в вашем роутере вы можете использовать что-то вроде

router.get('/', async function (req, res, next) {
  try{
    const payment = await create(json);
    res.send(payment);
  }catch(e){
    console.log(e);
  }
});
...