我正在设置一个GraphQL解析器来调用Braintree端点。 Braintree npm软件包希望使用如下代码来调用其端点:
braintreeGateway.customer.create({
firstName: "Jen",
lastName: "Smith",
company: "Braintree",
email: "jen@example.com",
phone: "312.555.1234",
fax: "614.555.5678",
website: "www.example.com"
}, function (err, result) {
result.success;
result.customer.id;
});
GraphQL解析器返回承诺。我试图弄清楚如何使此回调有效,并将其包含在Promise解析器中。
我已经阅读了很多有关实现回调的SO帖子,但是到目前为止,我发现的帖子似乎与这种用例不太匹配。
我已经尝试了很多事情,这是最新的:
getBrainTreeCustomerId: (parent, args, context) => {
const userid = context.userId;
const braintreeCustomerCreate = util.promisify(braintreeGateway.customer.create);
async function run_braintreeCustomerCreate() {
try {
let braintreeCustomerId = await braintreeCustomerCreate({
firstName: "Jen",
lastName: "Smith",
company: "Braintree",
email: "jen@example.com",
phone: "312.555.1234",
fax: "614.555.5678",
website: "www.example.com"
});
return braintreeCustomerId
}
catch (err) {
console.log('ERROR:', err);
}
}
return Promise.resolve()
.then(() => {
let braintreeCustomerId = (async () => {
let braintreeCustomerId = await run_braintreeCustomerCreate()
return braintreeCustomerId;
})();
return braintreeCustomerId;
})
.then((braintreeCustomerId) => {
return braintreeCustomerId;
})
.catch((err) => {
console.log(err);
});
}
}
但是catch处理程序收到一条错误消息,提示“无法读取未定义的属性'_createSignature'。”
这里使用的正确语法是什么?
答案 0 :(得分:0)
通过在网关范围之外设置promisified函数,您可能会将其与BrainTree
对象结构分离得过多。该错误听起来像是它正在尝试访问范围之外的另一个内部函数。尝试使用此方法而不使用util.promisify
:
async function run_braintreeCustomerCreate() {
return new Promise((resolve, reject) => {
braintreeGateway.customer.create(
{
firstName: "Jen",
lastName: "Smith",
company: "Braintree",
email: "jen@example.com",
phone: "312.555.1234",
fax: "614.555.5678",
website: "www.example.com"
},
(err, result) => {
if (err) return reject(err);
return resolve(result);
}
);
});
}
这将返回一个Promise,该Promise将根据调用的结果来解析或拒绝,同时以与对象一致的方式进行调用。
可以工作的另一种方式是像这样将promisified函数添加到客户对象:
const createAsPromise = util.promisify(braintreeGateway.customer.create);
braintreeGateway.customer.createAsPromise = createAsPromise;
async function run_braintreeCustomerCreate() {
try {
let braintreeCustomerId = await braintreeGateway.customer.createAsPromise(
{ /* data */ }
);
return braintreeCustomerId;
}
catch(err) console.log('ERROR:', err);
}
一般来说,您不需要在链中更早地进行捕获,因为.catch
可以工作,并且根本不需要try
,从而简化了逻辑。还要注意,从create
调用返回的对象将包含一个Id,而不仅仅是ID,它本身就是一个对象。实际上,将try
与catch
一起使用将阻止任何人调用该错误,因为最终将不返回任何值(即undefined
)作为已解析的值。>
答案 1 :(得分:0)
问题在于,如果您不将承诺函数作为方法调用,则this
方法中的create
值将不受约束。
const braintreeCustomerCreate = util.promisify(braintreeGateway.customer.create.bind(braintreeGateway.customer));
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
getBrainTreeCustomerId: async (parent, args, context) => {
const userid = context.userId;
try {
let braintreeCustomerId = await braintreeCustomerCreate({
firstName: "Jen",
lastName: "Smith",
company: "Braintree",
email: "jen@example.com",
phone: "312.555.1234",
fax: "614.555.5678",
website: "www.example.com"
});
return braintreeCustomerId;
}
catch (err) {
console.log('ERROR:', err);
return null;
}
}