NodeJS: проблема с запросом асинхронный, синхронный, API - PullRequest
0 голосов
/ 09 января 2011

У меня проблема с попыткой превратить асинхронную функцию в синхронную.

вот метод из класса:

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');

Reagards

Tom

Ответы [ 2 ]

4 голосов
/ 09 января 2011

Просто используйте обратный вызов.

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

  result = data;

});
1 голос
/ 09 января 2011

Невозможно превратить асинхронную функцию в синхронную.

Это просто невозможно сделать.

Вместо этого вы должны передать обратный вызов вашей функции и получить «возвращаемое значение» в асинхронном режиме.

Теоретически вы могли бы написать некоторый код, чтобы заблокировать возврат вашей функции до тех пор, пока не будет выполнено какое-либо условие (т. Е. До завершения асинхронной операции), но для этого также потребуется, чтобы программа могла выполнять другие действия в другом потоке во время выполнения блока, что, вероятно, невозможно в узле. И даже если бы это было так, это было бы антипаттерном мирового класса и преступлением против node.js и всего, что было бы вычеркнуто и, вероятно, вызвало бы велоцираптор.

Вывод: узнайте, как работать с асинхронным кодом. Кроме того, вам может быть интересно прочитать этот вопрос / ответ от вчерашнего дня (или, по крайней мере, ответ; вопрос не очень хорошо сформулирован).

...