在 Promise Resolver 中包含一个 Promisified 回调?
Include a Promisified Callback Inside A Promise Resolver?
我正在设置一个 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 解析器 return 承诺。我正在尝试弄清楚如何承诺此回调,并将其包含在承诺解析器中。
我已经阅读了很多关于承诺回调的 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 处理程序收到一条错误消息 "Cannot read property '_createSignature' of undefined"。
此处使用的正确语法是什么?
通过在网关范围之外设置 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);
}
);
});
}
这将 return 一个 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
调用的对象 return 将包含一个 Id,但它本身不仅仅是 Id - 它是一个对象。事实上,try
和 catch
会阻止错误被任何调用它的人看到,因为它最终会 return 什么都没有(即 undefined
),因为解析值。
问题是,如果您不将 promisified 函数作为方法调用,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;
}
}
我正在设置一个 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 解析器 return 承诺。我正在尝试弄清楚如何承诺此回调,并将其包含在承诺解析器中。
我已经阅读了很多关于承诺回调的 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 处理程序收到一条错误消息 "Cannot read property '_createSignature' of undefined"。
此处使用的正确语法是什么?
通过在网关范围之外设置 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);
}
);
});
}
这将 return 一个 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
调用的对象 return 将包含一个 Id,但它本身不仅仅是 Id - 它是一个对象。事实上,try
和 catch
会阻止错误被任何调用它的人看到,因为它最终会 return 什么都没有(即 undefined
),因为解析值。
问题是,如果您不将 promisified 函数作为方法调用,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;
}
}