0

非同期関数を同期関数に変換しようとすると問題が発生します。

クラスからのメソッドは次のとおりです。

doPost: function(call, data) {

    var uri = 'http://localhost/api/'+call;

    var api = http.createClient(80, 'localhost');

    var domain = 'localhost';

    var request = api.request("POST", uri,
                        {'host' : domain,
                         'Content-Type' : 'application/x-www-form-urlencoded', 
                         "User-Agent": this.userAgent,
                         'Content-Length' : data.length
                     });

    request.write(data);
    request.end();

    request.on('response', function (response) {  
        response.on ('data', function (chunk) {

            sys.puts(chunk);

            try {
                var result = JSON.parse(chunk);                    
                //------------ the problem

                return HOW_TO_RETURN_RESULT;

                //------------ /the problem
            }catch (err) {
                return {'ok': 0, 'err': err}
            }

        });
    });

},

この機能を次のように使用したい:

result = obj.doPost('getSomeData.php', '&data1=foo&data2=bar');

よろしく

トム

4

2 に答える 2

4

単にコールバックを使用してください。

obj.doPost('getSomeData.php', '&data1=foo&data2=bar', function(data) {

  result = data;

});
于 2011-01-09T13:14:28.250 に答える
1

非同期関数を同期関数に変えることは不可能です。

それは単に行うことはできません。

代わりに、関数にコールバックを渡し、「戻り値」を非同期で受け取る必要があります。

ただし、理論的には、何らかの条件が満たされるまで (つまり、非同期操作が完了するまで) 関数が戻るのをブロックするコードを書くことができますが、それには、ブロック中に別のスレッドで他のことを実行できるようにするプログラムも必要になります。これはおそらくノードでは不可能です。もしそうであったとしても、それは世界クラスのアンチパターンであり、node.js とすべての出来事に対する犯罪であり、おそらくヴェロキラプトルを召喚します。

まとめ: 非同期コードの操作方法を学びます。また、昨日のこの質問/回答 (または少なくとも回答; 質問はあまりよく表現されていません)を読むことに興味があるかもしれません。

于 2011-01-09T13:10:51.500 に答える