2017-09-14 4 views
1

Ich habe ein Problem. Ich muss zwei verschiedene SOAP-Aufrufe ausführen, um zwei Listen von Gutscheinen abzurufen, und dann diese Listen verwenden, um sie zu überprüfen und einige Aufgaben zu erledigen. Ich lege die zwei Anrufe in verschiedene Promise-Funktionen, weil ich den Job auf den Listen starten möchte, nachdem der Aufruf sein Ergebnis zurückgegeben hat. Dies ist der erste Versprechen Anruf:Pass Variablen zwischen Versprechen und Funktionen

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

Dies ist der zweite Versprechen Anruf:

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


    }); 
} 

Und das ist die Hauptfunktion, mit der Strömung Versprechen:

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

Wie kann Ich mache das? Ich habe viele Lösungen versucht, aber ich bin nicht in der Lage, VoucherTypeList und ermittelteTypeList in der Hauptfunktion zu sehen.

+0

Entschlossenheit gibt es aus einem Grund ... Was auch immer Sie übergeben, um zu lösen, wird an den dann Callback übergeben. – Salketer

Antwort

1

Die Callbacks then bekommen den Wert von dem, was Sie an die Funktion resolve in Ihren Versprechen übergeben. Sie passieren momentan beliebige Zeichenketten, die nutzlos ist ... Aber für die Demonstration, wollen wir diejenigen halten und nur die Werte in Ihrem Haupt-Skript log:

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

Ich werde Sie mit Ihrem Versprechen spielen lassen das passieren rechte Variablen ...

Jetzt scheint es, dass Ihre 2 Anrufe nicht sequentiell sein müssen, also machen wir sie parallel, es wird auch etwas einfacher für uns.

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

BONUS: Ich will nicht, um diese Aufgabe zu viel erschweren, bevor Sie es richtig erfassen. Also werde ich nicht mehr Code hinzufügen. Aber beachte, dass du auch Ablehnen verwenden solltest, anstatt deine Fehler in jedem Versprechen zu behandeln, solltest du sie ablehnen, wenn etwas schief läuft. Nur reject(err) und fügen Sie Ihrem Hauptscript einen zweiten Callback hinzu, um dann jeden Fehler zu behandeln, der passieren könnte. Wenn Sie weiterhin Ihre Versprechen einhalten, die nicht funktionieren, werden Sie nicht die Elemente weitergeben, die Sie erwarten, und Sie müssen bei jedem Schritt Prüfungen hinzufügen.

Lassen Sie uns den GetVouchers Callback ändern, um zu passen, was ich vorschlage.

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

Sobald es auf Ihre beiden Versprechen eingegangen ist, können wir Ihr Hauptskript ändern, um den Fehler entsprechend zu behandeln.

+0

Ok danke Ich versuche deine Lösung! vielen Dank für die Erklärung! – sharkbait

+0

siehe promisejs.org ihre Beispiele sind einfach zu folgen und Erklärungen klar. – Salketer

+0

Danke das funktioniert !!! Ich benutzte die 2. Lösung mit parallelem Soap Call. Vielen Dank. – sharkbait

Verwandte Themen