函数承诺更改为异步后不会返回任何内容

时间:2018-12-05 17:50:09

标签: javascript node.js express paypal promise

我正在使用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});
                });
            };
        };

该库似乎支持promises(功能:link),但是cb(null, response)在它是异步函数时并没有真正返回任何内容。我想念什么吗?有没有办法使其异步工作?

2 个答案:

答案 0 :(得分:3)

您需要Beta / 2.0 +版本才能在SDK中使用Promise。

不确定确切的包装内容是什么,但是对于节点样式的回调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);
  }
});

答案 1 :(得分:0)

扩展了Cody G的答案。

正确的是,您需要升级到Beta v2 +才能在sdk中使用promises,尽管如果您愿意这样做,则在升级后您会发现其中存在重大变化。

您可以在此处阅读完整的文档:

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