在Promise Resolver中包含Promiseized回调



我正在设置一个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。我正试图弄清楚如何对这个回调进行promise,并将其包含在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"。

这里使用的正确语法是什么?

通过将promiseized函数设置在网关的作用域之外,您可能将其与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在以与对象一致的方式调用时根据调用结果解析或拒绝。

可能工作的另一种方法是将promised函数添加到客户对象中,如下所示:

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——它是一个对象。事实上,trycatch将阻止调用它的人看到错误,因为它最终将不返回任何值(即undefined(作为解析值。

问题是,如果不将promiseized函数作为方法调用,则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;
}
}

最新更新