2011-01-09 2 views
0

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

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

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

Том

ответ

1

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

Это просто невозможно.

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

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

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

+0

Я читал о «обещаниях» в node.js, но не могу найти пример, соответствующий моему коду. – Tom

+1

Посылы в значительной степени обратные вызовы в маскировке – Jakob

+0

Кроме того, даже если обещания сделали то, что вы хотели, node.js не имеет их: http://japhr.blogspot.com/2010/04/no-more-promises- in-nodejs.html – Jakob

4

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

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

    result = data; 

}); 
+2

Это не превращает его в синхронную функцию. Это точно противоположно этому. (Но, с другой стороны, это, конечно, именно то, как эта функция должна использоваться). – Jakob

+0

Спасибо :) работаю идеально – Tom

Смежные вопросы