gpt4 book ai didi

javascript - 在 Promise 和函数之间传递变量

转载 作者:行者123 更新时间:2023-11-30 21:10:22 28 4
gpt4 key购买 nike

我有一个问题。我必须执行两个不同的 SOAP 调用来检索两个凭单列表,然后使用这些列表对它们进行检查并完成一些工作。我将这两个调用放在不同的 Promise 函数中,因为我想在调用返回结果后启动列表中的作业。这是第一个 Promise 调用:

    let vouchers = function(voucherTypeList){
return new Promise(function(resolve,reject){
const categoryId = "1000";
let args = {
"tns:CategoryId": categoryId
};
var header = {
"tns:Authenticate": {
"tns:UserName": soapVoucherWsdlUsername,
"tns:Password": soapVoucherWsdlPassword
}
};

// let voucherTypeList;
voucherClient.addSoapHeader(header);
voucherClient.GetVouchers(args, function(err, result) {
console.log("DENTRO GET VOUCHERS");
if (err) {
console.log(err);
writeResponse(res, '200', err);
} else {
//++++++++++++++++++++++
//voucherTypeList is what I want to return to the main function
voucherTypeList = mapGetVoucherTypeListResponse(result);
//++++++++++++++++++++++
}
resolve("done 1");
});
});
}

这是第二次 Promise 调用:

let issuedVouchers = function(accountId) {
return new Promise(function (resolve, reject) {
const categoryId = "1000";
let args = {
"tns:CategoryId": categoryId,
"tns:CheckRedeem": true,
"tns:IncludeRedeemed": false,
"tns:CardId": accountId
};
var header = {
"tns:Authenticate": {
"tns:UserName": soapVoucherWsdlUsername,
"tns:Password": soapVoucherWsdlPassword
}
};

let issuedVoucherList;
voucherClient.addSoapHeader(header);
voucherClient.GetVouchers(args, function (err, result) {
console.log("DENTRO GET ISSUED VOUCHERS");
if (err) {
console.log(err);
writeResponse(res, '200', err);
} else {
//++++++++++++++++++++++
//issuedTypeList is what I want to return to the main function
issuedTypeList = mapGetVoucherTypeListResponse(result);
//++++++++++++++++++++++
}
resolve("done 2");
});


});
}

这是主要功能,带有 Promise 流程:

function getAvailableVoucherTypes(req, res) {
var accountId = req.params.accountId;
vouchers(voucherTypeList).
then(issuedVouchers(accountId)).
then(function() {
//here I want to use voucherTypeList and issuedTypeList
//and do some jobs on them
console.log("OK");
});
}

我该怎么做?我尝试了很多解决方案,但在主函数中看不到 voucherTypeListissuedTypeList

最佳答案

then 回调获取您在 promise 中传递给 resolve 函数的值。您目前正在传递任意字符串,这是无用的...但是为了演示,让我们保留这些字符串并将它们的值记录在您的主脚本中:

function getAvailableVoucherTypes(req, res) {
var accountId = req.params.accountId;
vouchers(voucherTypeList).
then(function(result){
console.log(result); //done 1
return issuedVouchers(accountId);
}).
then(function(result) {
console.log(result); //done 2
//here I want to use voucherTypeList and issuedTypeList
//and do some jobs on them
console.log("OK");
});
}

我会让你玩弄你的 promise 来传递正确的变量......

现在,您的 2 个调用似乎不需要按顺序进行,所以让我们将它们并行化,这对我们来说也会稍微容易一些。

function getAvailableVoucherTypes(req, res) {
var accountId = req.params.accountId;
var promises = [vouchers(),issuedVouchers(accountId)]
Promise.all(promises).then(function(results){
//In Promise.all, the results of each promise are passed as array
//the order is the same as the order of the promises array.
var voucherTypeList = results[0];
var issuedTypeList = results[1];
});
}

奖励:在您正确掌握之前,我不想让这项任务过于复杂。所以我不会添加更多代码。但请注意,你也应该使用 reject,而不是在每个 promise 中处理你的错误,你应该在出现问题时拒绝它们。只需 reject(err) 并向您的主脚本添加第二个回调,然后处理可能发生的任何错误。如果您继续解决无效的 promise ,您将不会传递您期望的元素,并且您需要对每个步骤添加检查。

让我们修改 GetVouchers 回调以适应我的建议。

voucherClient.GetVouchers(args, function (err, result) {
console.log("DENTRO GET ISSUED VOUCHERS");
if (err) {
reject(err);
} else {
resolve(mapGetVoucherTypeListResponse(result));
}
});

完成您的两个 promise 后,我们可以更改您的主脚本以相应地处理错误。

Promise.all(promises).then(function(results){
//Handle success like above.
},function(err){
//Handle error.
console.log(err.stack || err);
writeResponse(res, '200', err);
});

关于javascript - 在 Promise 和函数之间传递变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46213475/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com