2016-04-24 21 views
5

Giả sử tôi có chức năng Đồng bộ như path.join(). Tôi muốn bọc nó vào một số Promise bởi vì tôi muốn sự giải thích được xử lý trong khối catch(). Nếu tôi quấn như dưới đây, tôi không thể là ngoại lệ trong số Promise 's .catch() khối. Vì vậy, tôi phải sử dụng if để kiểm tra giá trị trả lại, nếu đó là một lỗi hay không và sau đó gọi giải quyết, từ chối chức năng. Có bất kỳ giải pháp khác?Cách tốt nhất để bọc các chức năng đồng bộ vào lời hứa

var joinPaths = function(path1,path2) { 
    return new promise(function (resolve, reject) { 
    resolve(path.join(path1, path2)); 
    }); 
}; 
+2

Tại sao bạn muốn đưa chức năng đồng bộ vào một lời hứa? –

+1

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 –

+1

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

Trả lời

6

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).

+0

Nếu tôi đang sử dụng 'path.join' trong chuỗi lời hứa và tôi muốn xử lý các ngoại lệ trong' .catch() 'của' lời hứa', tôi có thể làm như thế nào với ra gói nó vào một lời hứa? – CoderS

+2

@ Srinesh - Như mọi khi, nếu bạn đặt mã thực tế và vấn đề thực tế của bạn vào câu hỏi của bạn, chúng tôi có thể giúp bạn tốt hơn nhiều. Tôi không làm theo chính xác những gì bạn đang cố gắng làm. Trình xử lý '.then()' trong một chuỗi lời hứa đã được bao bọc trong một try/catch và bất kỳ ngoại lệ nào được ném vào một trình xử lý '.then()' sẽ tự động từ chối chuỗi lời hứa. Bạn không phải làm bất cứ điều gì để có được hàm đó bên trong một trình xử lý '.then()'. Bạn cũng có thể sử dụng try/catch để bắt ngoại lệ đồng bộ và xử lý nó cục bộ. – jfriend00

+1

Một lý do tại sao bạn có thể muốn bọc chức năng đồng bộ trong lời hứa là nếu bạn đang cố gắng tuân theo hợp đồng, nghĩa là 'if (needsUpdating) {return object.asyncUpdate(); } else {return object}; 'Nếu một đường dẫn trả về một Promise, thì đường dẫn khác nên như vậy, ngay cả khi nó không chạy bất kỳ mã async nào. –

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