2014-05-23 31 views
12

Mam funkcję, która wykonuje pewną operację przy użyciu tablicy. Chciałbym go odrzucić, gdy tablica jest pusta.Przyrzeczenie obietnicy Prawdopodobnie nieobsługiwany Błąd:

Jako przykład

myArrayFunction(){ 
     return new Promise(function (resolve, reject) { 
      var a = new Array(); 
      //some operation with a 
      if(a.length > 0){ 
       resolve(a); 
      }else{ 
       reject('Not found'); 
      }   
     }; 
} 

Podczas operacji Odrzuć dzieje otrzymuję następujący błąd. Prawdopodobnie nieobsługiwany Błąd: Nie znaleziono

Jednak mam następujące haczyki, gdy wywołanie funkcji myArrayFunction() jest wykonane.

handlers.getArray = function (request, reply) { 
    myArrayFunction().then(
     function (a) { 
      reply(a); 
     }).catch(reply(hapi.error.notFound('No array'))); 
}; 

Jaki byłby właściwy sposób na odrzucenie obietnicy, złapanie odrzucenia i udzielenie odpowiedzi klientowi?

Dziękuję.

Odpowiedz

18

.catch przyjmuje funkcję jako parametr, ale przekazuje ją coś innego. Kiedy nie przekażemy żadnej funkcji do złapania, po cichu nic nie zrobimy. Głupi, ale tak właśnie obiecuje ES6.

Ponieważ .catch nic nie robi, odrzucenie staje się nieobsługiwane i jest zgłaszane użytkownikowi.


Fix jest przekazać funkcję .catch:

handlers.getArray = function (request, reply) { 
    myArrayFunction().then(function (a) { 
     reply(a); 
    }).catch(function(e) { 
     reply(hapi.error.notFound('No array'))); 
    }); 
}; 

Ponieważ używasz złapać wszystkie, błąd niekoniecznie jest błąd Nie tablicą. Proponuję zrobić to zamiast:

function myArrayFunction() { 
    // new Promise anti-pattern here but the answer is too long already... 
    return new Promise(function (resolve, reject) { 
      var a = new Array(); 
      //some operation with a 
      if (a.length > 0) { 
       resolve(a); 
      } else { 
       reject(hapi.error.notFound('No array')); 
      } 
     }; 
    } 
} 

function NotFoundError(e) { 
    return e.statusCode === 404; 
} 

handlers.getArray = function (request, reply) { 
    myArrayFunction().then(function (a) { 
     reply(a); 
    }).catch(NotFoundError, function(e) { 
     reply(e); 
    }); 
}; 

które można dodatkowo skrócić do:

handlers.getArray = function (request, reply) { 
    myArrayFunction().then(reply).catch(NotFoundError, reply); 
}; 

Również zauważyć różnicę między:

// Calls the method catch, with the function reply as an argument 
.catch(reply) 

I

// Calls the function reply, then passes the result of calling reply 
// to the method .catch, NOT what you wanted. 
.catch(reply(...)) 
+0

Poprawka miała przekazać funkcję do .catch zgodnie z sugestią. Druga opcja tj. .catch (NotFoundError, reply); daje mi następujący błąd "Filtr przechwytywania musi być konstruktorem błędu lub funkcją filtru" – juan

+0

@juan zaimplementowałeś NotFoundError – Esailija

+0

Tak, został zaimplementowany. – juan