在Promises和函数之间传递variables

我有个问题。 我必须做两个不同的SOAP调用才能检索两张凭证列表,然后使用这些列表对他们进行检查并完成一些工作。 我把这两个调用放在不同的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"); }); }); } 

这是第二个承诺:

 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"); }); }); } 

这是Promisestream程的主要function:

 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"); }); } 

我怎样才能做到这一点? 我尝试了很多解决scheme,但是我无法在main函数中看到voucherTypeListissuedTypeList

thencallback正在获取您传递给您的承诺中的resolvefunction的价值。 您目前正在传递任意string,这是无用的…但是对于演示,让我们保留这些,只是将它们的值logging在您的主脚本中:

 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"); }); } 

我会让你玩你的承诺,通过正确的变数…

现在看来,你的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(err)并添加第二个callback到你的主脚本,然后处理任何可能发生的错误。 如果你不断的解决你的承诺,那么你就不会传递你期待的内容,你需要在每一步中添加检查。

让我们修改GetVoucherscallback以适应我的build议。

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

一旦完成了你的承诺,我们可以改变你的主脚本来处理相应的错误。

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