2015-08-31 7 views
5

Sto provando a racchiudere una funzione da un pacchetto nodo con wrapAsync.Meteor wrapAsync viene eseguito in modo sincrono ma non restituisce mai

filepicker = new Filepicker('API Key') 
filepickerStatSync = Meteor.wrapAsync(filepicker.stat, filepicker) 
result = filepickerStatSync(url); 
console.log('after') 

La funzione stat è riportata di seguito.

Tutto sembra funzionare correttamente ... la chiamata di richiesta risponde con il risultato corretto, il callback finale viene chiamato, l'intera operazione viene eseguita in modo sincrono/restituisce correttamente per quanto posso dire ... ma la chiamata di sincronizzazione non restituisce mai e console.log ('after') non viene mai colpito.

Non penso di aver commesso lo stesso errore di questo question perché la mia funzione ha un callback come ultimo parametro.

anche io non credo che la soluzione è in questo question perché la funzione avvolto finisce con chiamando la callback con l'errore e il risultato, che si suppone sia quello Meteor.wrapAsync è alla ricerca di una firma.

Filepicker.prototype.stat = function(url, options, callback) { 
    callback = callback || function(){}; 
    if(!options) { 
     options = {}; 
    } 
    if(!url) { 
     callback(new Error('Error: no url given')); 
     return; 
    } 
    request({ 
     method: 'GET', 
     url: url+'/metadata?', 
     form: { 
      size: options.size || true, 
      mimetype: options.mimetype || true, 
      filename: options.filename || true, 
      width: options.width || true, 
      height: options.height || true, 
      writeable: options.writeable || true, 
      md5: options.md5 || true, 
      path: options.path || true, 
      container: options.container || true, 
      security: options.security || {} 
     } 
    }, function(err, res, body) { 
     console.log('err = '+err); 
     console.log('res = '+res); 
     console.log('body = '+body); 
     if(err) { 
      callback(err); 
      return; 
     } 
     var returnJson; 
     if(typeof(body)==='string'){ 
      try { 
       returnJson = JSON.parse(body); 
      } catch(e) { 
       callback(new Error('Unknown response'), null, body); 
       return; 
      } 
     } else { 
      console.log('returnJSON'); 
      returnJson = body; 
     } 
     console.log('callbacked'); 
     callback(null, returnJson); 
    }); 
}; 

risposta

2

La funzione si è avvolgente prende tre argomenti, ma si stanno fornendo solo due: url, e (implicitamente) la funzione di callback (lo chiamerò cb). Quindi internamente, ciò che verrà eseguito è Filepicker.prototype.stat(url, cb), vale a dire, la funzione di callback cb verrà interpretata come options anziché callback e callback verrà impostata su una funzione vuota. Quindi il callback di wrapAsync non viene mai chiamato, perché la catena di callback è stata interrotta.

Questo dovrebbe funzionare:

result = filepickerStatSync(url, {}); 
+0

Grazie gentilmente. Silly oversight da parte mia. Tornerò e assegnerò la taglia quando il sistema me lo permetterà. Saluti! – funkyeah