2017-09-14 117 views
1

我遇到问题。 我必须做两个不同的SOAP调用才能检索两张凭单列表,然后使用这些列表对它们进行检查并完成一些工作。 我把两个调用放在不同的Promise函数中,因为我想在调用返回结果后在列表中启动作业。 这是第一个承诺呼叫:Promises和函数之间传递变量

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


    }); 
} 

这是主要功能,与无极流量:

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

哪有我这样做?我尝试了很多解决方案,但我无法在主函数中看到voucherTypeList发布的TypeList

+0

解决方法是有原因的...无论你传递给解决方案将传递给当时的回调。 – Salketer

回答

1

then回调正在获取您在承诺中传递给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"); 
     }); 
} 

我会让你和你的承诺,通过打右变量...

现在,你的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),然后向主脚本添加第二个回调函数,以处理可能发生的任何错误。如果你不断解决你的承诺并不起作用,那么你不会传递你期待的内容,你需要在每一步中添加检查。

让我们修改GetVouchers回调以符合我的建议。

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); 
}); 
+0

好的,谢谢我正在尝试你的解决方案!非常感谢你的解释! – sharkbait

+0

看到promise_s.org他们的例子只是简单地遵循和解释清楚。 – Salketer

+0

谢谢这个作品!我使用了第二种解决方案,并行SOAP调用。非常感谢你。 – sharkbait