2014-05-23 21 views
12

Tôi có một chức năng thực hiện một số thao tác sử dụng một mảng. Tôi muốn từ chối nó khi mảng trống.Từ chối lời hứa Có thể không được giải quyết Lỗi:

Như một ví dụ

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

Khi từ chối hoạt động xảy ra tôi nhận được lỗi sau. Có thể không được giải quyết Lỗi: Không tìm thấy

Tuy nhiên, tôi có lệnh sau khi cuộc gọi đến hàm myArrayFunction() được thực hiện.

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

Cách chính xác để từ chối lời hứa, bắt bị từ chối và phản hồi với khách hàng là gì?

Cảm ơn bạn. Tuy nhiên,

Trả lời

18

.catch có chức năng như thông số, bạn đang chuyển cho nó một thứ khác. Khi bạn không vượt qua một chức năng để bắt, nó sẽ âm thầm chỉ không làm bất cứ điều gì. Ngu ngốc nhưng đó là những gì ES6 hứa hẹn.

Bởi vì .catch không làm bất kỳ điều gì, việc từ chối trở nên không được xử lý và được báo cáo cho bạn.


Fix là phải vượt qua một chức năng để .catch:

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

Bởi vì bạn đang sử dụng một nắm bắt tất cả, lỗi không nhất thiết phải là một lỗi Không mảng. Tôi đề nghị bạn làm điều này thay vì:

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

Mà có thể được tiếp tục rút ngắn xuống còn:

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

Cũng lưu ý sự khác biệt giữa:

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

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

Việc sửa chữa là để vượt qua một chức năng để .catch như bạn đề nghị. Tùy chọn thứ hai tức là .catch (NotFoundError, reply); cung cấp cho tôi lỗi sau "Bộ lọc bắt phải là hàm tạo lỗi hoặc chức năng lọc" – juan

+0

@juan bạn đã triển khai NotFoundError – Esailija

+0

Có, tôi đã triển khai bộ lọc này. – juan

Các vấn đề liên quan