Không rõ lý do tại sao bạn sẽ thực hiện thao tác đồng bộ trong khi hứa sẽ khó sử dụng và thao tác đồng bộ hơn trong chuỗi lời hứa.
Hai nơi duy nhất tôi thấy hữu ích khi hứa hẹn một điều gì đó đồng bộ là bắt đầu chuỗi lời hứa nơi các hoạt động tiếp theo sẽ không đồng bộ hoặc khi bạn đang phân nhánh và một kết quả của nhánh là lời hứa không đồng bộ và khác là đồng bộ. Sau đó, trong trường hợp đó, bạn chỉ muốn trả lại lời hứa trong cả hai trường hợp để người gọi có giao diện đồng bộ nhất quán bất kể nhánh nào được thực hiện.
Ngoài ra, bạn thường không nên thực hiện những điều đồng bộ không đồng bộ vì nó chỉ cần làm phức tạp không cần thiết khi sử dụng chúng.
Cách đơn giản nhất tôi biết để làm cho nó thành một lời hứa sẽ là:
Promise.resolve(path.join(path1, path2)).then(function(path) {
// use the result here
});
mỗi bình luận của bạn, bên trong một handler .then()
, trường hợp ngoại lệ đã bị bắt bởi cơ sở hạ tầng hứa hẹn và biến thành một lời hứa từ chối . Vì vậy, nếu bạn có điều này:
someAsyncOp().then(function(value) {
// some other stuff
// something that causes an exception
throw new Error("timeout");
}).catch(function(err){
console.log(err); // will show timeout
});
Sau đó, ngoại lệ đó đã được lập bản đồ thành lời hứa từ chối cho bạn. Tất nhiên, nếu bạn muốn xử lý ngoại lệ bên trong trình xử lý .then()
(không chuyển lời hứa thành từ chối), thì bạn có thể sử dụng try/catch truyền thống xung quanh hoạt động đồng bộ của mình để bắt ngoại lệ cục bộ (không khác với bất kỳ trường hợp nào khác) mã đồng bộ). Tuy nhiên, nếu bạn muốn lời hứa từ chối nếu có ngoại lệ bên trong trình xử lý .then()
, thì tất cả sẽ được thực hiện cho bạn một cách tự động (một tính năng rất hay của lời hứa).
Tại sao bạn muốn đưa chức năng đồng bộ vào một lời hứa? –
Kiểm thử đơn vị là trường hợp phổ biến khi cần thay thế một số cuộc gọi không đồng bộ với giá trị mã hoá cứng –
Cách tốt nhất để bọc chức năng đồng bộ vào lời hứa là không thực hiện. – Bergi