2013-07-09 7 views
5

https://github.com/danwrong/restler http://nodejs.org/javascript restler come bloccare/aspettare su una richiesta

al fine di scaricare un file, io sto usando restler da nodejs in uno script lato server (non da un browser Web client).

ho potuto utilizzare il modo asincrono per generare un evento quando il download è completato, come segue:

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

ma io preferisco usare un modo di sincronizzazione questa volta.

come posso chiamare questo e bloccare/attendere fino a quando non ottengo la risposta?

e come ottenere i dati o errore dopo

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

C'è una grande ragione di avere metodi asincroni e si bloccherà l'intero processo che comporterà l'inattività di altre richieste/risposte. C'è sempre un modo per aggirarlo e utilizzare i metodi asincroni attuali. Per favore, potresti descrivere quale motivo vuoi avere una situazione di blocco, e potrebbe esserci una buona soluzione per rimanere asincrona con soddisfacenti bisogni logici delle tue sfide. – moka

+0

non è uno script in un browser client. è un semplice script in un server, che viene eseguito e completato quando il download è pronto. non ho bisogno di async qui. –

+0

Scaricherà e attiverà "finito" con sincronizzazione o asincrono, non è rilevante allora. Quindi la domanda "perché dovresti fare la sincronizzazione", se asincrono è lo stesso risultato? Ad ogni modo. 'restler' non ha metodi' sync' o opzioni per i metodi. Potresti implementarlo da solo. – moka

risposta

1

Penso che tu sia alla ricerca di una libreria come Step, che renderà restler apparire sincrona.

Fornisci una serie di funzioni, in modo da poter scrivere il codice in modo più lineare.

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

e questa risposta a: http://stackoverflow.com/a/17689177/280393 –

Problemi correlati