2013-07-09 16 views
5

https://github.com/danwrong/restler http://nodejs.org/javascript restler jak zablokować/czekać na wniosek

w celu pobrania pliku, używam restler z nodejs w skrypcie po stronie serwera (nie z poziomu przeglądarki internetowej, klienta).

mogę używać sposób asynchronicznej ognia zdarzenie po zakończeniu pobierania, jak następuje:

rest = require('./restler'); 
rest.get('http://google.com').on('complete', function(result) { 
    if (result instanceof Error) { 
    sys.puts('Error: ' + result.message); 
    this.retry(5000); // try again after 5 sec 
    } else { 
    sys.puts(result); 
    } 
}); 

ale wolę używać synchronizacji drogę tym razem.

jak mogę to sprawdzić i zablokować/zaczekać, aż otrzymam odpowiedź?

i jak uzyskać dane lub błąd potem

var req = rest.get('http://twaud.io/api/v1/users/danwrong.json'); 
// how to block/wait here until file is downloaded 
if (req.response instanceof Error) { // this does not worn neither 
    ... 
} else { 
    ... 
} 
+0

Istnieje duży powód posiadania asynchronicznych metod, a także zablokujesz cały proces, który będzie wymagał odciążenia innych żądań/odpowiedzi. Zawsze istnieje sposób obejścia tego i korzystania z rzeczywistych metod asynchronicznych. Czy mógłbyś opisać powód, dla którego chcesz zablokować sytuację, i może być dobrym rozwiązaniem, abyś mógł pozostać asynchronicznym z logicznymi potrzebami swoich wyzwań. – moka

+0

to nie jest skrypt w przeglądarce klienta. jest to prosty skrypt na serwerze, który działa i kończy się, gdy pobieranie jest gotowe. nie potrzebuję tutaj asynchronicznego ustawienia. –

+0

Będzie pobierać i uruchamiać "zakończone" zsynchronizowane lub asynchroniczne, to nie ma znaczenia. Więc pytanie "dlaczego chcesz zrobić synchronizację", czy asynchroniczny jest taki sam wynik? W każdym razie. 'restler' nie ma metod' 'sync' ani opcji dla metod. Możesz to zaimplementować samodzielnie. – moka

Odpowiedz

1

myślę szukasz biblioteki jak Step, który pozwoli restler pojawiają synchroniczny.

Podajesz mu szereg funkcji, dzięki czemu możesz napisać swój kod w bardziej liniowy sposób.

var rest = require('restler'); 
var Step = require('step'); 
var sys = require('sys'); 

function retry(millis) { 
    console.log('Queing another try'); 
    setTimeout(download, millis); 
} 

function download() { 
    Step(function() { 
      // 1 
      console.log('Starting download'); 
      rest.get('http://google.com').on('complete', this); 
     }, 
     function(result) { 
      // 2 
      console.log('Download complete'); 
      if (result instanceof Error) { 
       sys.puts('Error: ' + result.message); 
       retry(5000); // try again after 5 sec 
      } else { 
       sys.puts(result); 
      } 
      return result; 
     }, 
     function(result) { 
      // 3 
      console.log("This won't run until after Download is complete"); 
     }); 
} 
download(); 
+0

i ta odpowiedź na: http://stackoverflow.com/a/17689177/280393 –

Powiązane problemy