2017-09-14 153 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