Javascript 函数承诺在更改为异步后不返回任何内容
我正在使用paypal节点SDK库调用paypal API。它使用这样的承诺:Javascript 函数承诺在更改为异步后不返回任何内容,javascript,node.js,express,paypal,promise,Javascript,Node.js,Express,Paypal,Promise,我正在使用paypal节点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); } });
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});
});
};
};
这个库似乎支持承诺(feature:),但是当它是一个异步函数时,
cb(null,response)
实际上并没有返回任何东西。我错过什么了吗?有没有办法让它异步工作?您需要beta/version 2.0+才能在sdk中使用承诺
不确定您的包装是什么,但是对于节点样式的回调函数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);
}
}
};
}
然后可由constpayment=wait create(json)使用代码>
然后在你的路由器中,你可以使用
router.get('/', async function (req, res, next) {
try{
const payment = await create(json);
res.send(payment);
}catch(e){
console.log(e);
}
});
您需要beta/Version2.0+才能在sdk中使用承诺
不确定您的包装是什么,但是对于节点样式的回调函数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);
}
}
};
}
然后可由constpayment=wait create(json)使用代码>
然后在你的路由器中,你可以使用
router.get('/', async function (req, res, next) {
try{
const payment = await create(json);
res.send(payment);
}catch(e){
console.log(e);
}
});
扩展Cody G.的答案
您需要升级到beta v2+以使用sdk中的承诺,这是正确的,尽管如果您希望这样做,升级后您会发现有突破性的更改
您可以在此处阅读完整的文档:
还有一个从v1到v2的迁移指南:
扩展Cody G.的答案。
您需要升级到beta v2+以使用sdk中的承诺,这是正确的,尽管如果您希望这样做,升级后您会发现有突破性的更改
您可以在此处阅读完整的文档:
还有一个从v1到v2的迁移指南:
只有beta版才有promise支持,您使用的是beta版(2.0+)@CodyG。1.8.1版本。。。我将改为2.0.0测试版,看看它是否有效。只有测试版有承诺支持,你在使用测试版(2.0+)@CodyG。1.8.1版本。。。我将改为2.0.0测试版,看看它是否有效。