2015-07-14 11 views
6

Jak mogę zawinąć funkcję, która może mieć funkcję synchronizacji/synchronizacji wewnątrz z obietnicą?Wrap w obietnicy JavaScriptowa ogólna funkcja

mam wywołanie funkcji jak po

action[fn](req, res); 

w funkcji fn (w poniższym przykładzie) jest prowadzony może mieć wewnątrz (używam dynamicznego połączenia dla każdej funkcji) Synchronizacja lub a-sync jak poniżej przykład,

  1. Jak zaleca się go opakować w obietnicę.
  2. Jak obsługiwać błędy jeśli ...

używam aplikacji nodeJS

run: function (req, res, filePath) { 
     var writeStream = fs.createWriteStream(fileRelPath, {flags: 'w'}); 
     req.pipe(writeStream); 
     req.on("end", function() { 
      console.log("Finish to update data file") 
     }); 
     res.end("File " + filePath + " saved successfully"); 
    } 
+0

Jaki jest faktyczny problem? Jak myślisz, dlaczego Obietnice mogą ci pomóc? – thefourtheye

Odpowiedz

1

na przykład możemy użyć Q libary i odroczenia, coś takiego:

run: function (req, res, filePath) { 
     var d = Q.defer(); 

     var writeStream = fs.createWriteStream(fileRelPath, {flags: 'w'}); 
     req.pipe(writeStream); 
     req.on("end", function() { 
      console.log("Finish to update data file"); 
      d.resolve(); 
     }); 

     req.on("error", function (err) { 
      d.reject(err); 
     }); 



     return d.promise.then(function(){ 
      res.end("File " + filePath + " saved successfully"); 
     }).catch(function(err){ 
      //handle error 
     }) 
    } 

W tym kodzie obietnica rozwiąże się po wymagającym zdarzeniu końcowym, a następnie res.end, ale polecam stworzyć inną metodę zakończenia reakcji i pracować z obietnicą od uruchomienia metody. Powodzenia!

+0

Dzięki, ale jak mam obsługiwać błędy w metodzie invoke? –

+0

można użyć catch – siavolt

+0

to będzie działać w async (próba catch)? –