1

私はmilewiseのnode-soapクライアントを使用しています(ちなみにAPIを作成しています)が、正しいスコープへのコールバックの結果を取得するのにいくつかの困難があります。

ここに私が今持っているコードがあります:

function generateSoapRequest(req, res, next)
{ 
    soap.createClient('http://127.0.0.1:' + cfg.service_port + cfg.service_url_path,
    function(err, client) {
        client.CXIf.CXIf.CXProcessXML(
            {"XMLRequestData": {"CXLogon": {"UserID":"1901007", "Password":"2580", "LogonType":11 } } }, 
            function(err, result, body) {
            if (err) {
                console.log(err);
                return;
            }
            console.log(result);

            var cxresponse = result.XMLResponse[0].CXResponse;
            console.log('SessionID:' + cxresponse.SessionID + ' SessionInstanceID:' + cxresponse.SessionInstanceID);
        });
    });
}

function getVoiceMailInformation(req, res, next) {
    var cxresponse = generateSoapRequest(req, res, next);
    var something = doSomethingNext(cxresponse);
}

function doSomethingNext(cxresponse){....; return something;}

基本的に、getVoiceMailInformation() を起動すると、SOAP クライアントが作成され、generateSoapRequest() を通じていくつかの情報が要求されます。次のステップは、その関数の結果を取得し (方法がわからないため、上記のコードには実装されていません)、別のことを行うことです。

私の問題は、soap.createClient が非同期であるため、関数が完了した後にコールバックが起動されることです。

最善のアプローチは何ですか?(些細なことかもしれませんが、javascript の匿名関数のスコープは私を殺しているものです。)

どんな助けでも大歓迎です。

4

1 に答える 1

0

基本的に、次のようなことはできません。

var cxresponse = generateSoapRequest(req, res, next);

呼び出している関数が非同期コードを呼び出すため、そのコードによって決定される値を返すことができないためです。これを回避する通常の方法は、結果が利用可能になったときに結果とともに呼び出される関数の追加のコールバック パラメータを関数に与えることです。無名関数である必要はありません。名前付き関数にすることができます。あなたの場合、(generateSoapRequestコールバックを 4 番目の引数として取り、結果の準備ができたときにそれを呼び出すように変更したと仮定すると、次のように書くことができます

generateSoapRequest(req, res, next, doSomethingNext);

そして、引数としてdoSomethingNext呼び出されます。cxresponseもちろん、これdoSomethingNextも非同期で呼び出されるため、値を返すことはできないため、同じ手法を適用する必要があります。

async モジュールは、この種のことをより簡単にします。特に、その「ウォーターフォール」パターンは、順番に実行する必要のある一連の関数があり、それぞれが前の関数からコールバックされる場合に役立ちます。

于 2012-08-10T00:37:33.837 に答える