2015-04-03 30 views
5

Tôi rõ ràng là sự hiểu lầm một cái gì đó về một trong hai cách js hứa hẹn được giải quyết hoặc về ngữ nghĩa của "trở lại."Làm cách nào để chặn lời hứa javascript và trả lại kết quả đã giải quyết?

Tôi đang được gọi bằng chức năng mong muốn tôi đồng bộ - để trả về giá trị. Tính toán giá trị mà đòi hỏi một số mã không đồng bộ (đặc biệt là các phương pháp ForEach trên dstore Collection

Những gì tôi đang cố gắng để đạt được là xấp xỉ này, nhưng điều này không làm việc trong đó các chức năng mySynchronousFunction không có giá trị trả về.

function mySynchronousFunction() { 
    var accumulator = {}; 
    var myPromise = doAsynchronousThingThatSideEffectsAccumulator(); 
    // Now my caller is expecting the value of accumulator. 
    myPromise.then(function() {return accumulator;}) 
} 

tôi hiểu rằng JS đã cho phép triển khai đơn luồng, do đó nó không được làm mát để ngăn chặn, nhưng phải có một số mô hình cho dán không đồng bộ mã đồng bộ, mà tôi vừa bỏ qua.

+0

Nó không phải về việc cho phép triển khai chuỗi đơn - ** tất cả triển khai ** nhất thiết phải là một luồng đơn. – meagar

+0

@meagar đó là không đúng sự thật - không có gì nói rằng tất cả các hiện thực là đơn luồng - ví dụ Rhino trong Java. –

+1

Không thể thêm câu trả lời nhưng điều này hữu ích cho tôi: http://www.tivix.com/blog/making-promises-in-a-synchronous-manner/ – rainabba

Trả lời

5

Bạn không thể tạo một kết quả đồng bộ từ một phép toán không đồng bộ n trong Javascript. Bạn không thể làm được. Nếu bất kỳ phần nào của hoạt động của bạn không đồng bộ, toàn bộ kết quả phải không đồng bộ và bạn phải sử dụng gọi lại, lời hứa hoặc một số cơ chế khác để giao tiếp khi hoạt động được thực hiện và kết quả đã sẵn sàng.

Nếu hoạt động async của bạn đã trả về một lời hứa (mà có vẻ như), sau đó bạn chỉ nên trả lại mà từ chức năng wrapper:

function myWrapperFunction() { 
    var accumulator = {}; 
    var myPromise = doAsynchronousThingThatSideEffectsAccumulator(accumulator); 
    // Now my caller is expecting the value of accumulator. 
    return myPromise.then(function(result) { 
     // operate on the accumulator object using the async result 
     return accumulator; 
    }) 
} 

myWrapperFunction.then(function(accumulator) { 
    // write your code here that uses the accumulator result 
}); 

Bạn cũng có thể muốn lưu ý rằng một chức năng mà hoạt động này qua bên hiệu ứng hiếm khi là mẫu thiết kế tốt nhất. Bạn cũng có thể vượt qua trong đầu vào và làm cho nó trả về kết quả đầu ra thông qua lời hứa đã được giải quyết và tránh hoàn toàn tác dụng phụ.

3

Không, không có cách nào để tạo mã không đồng bộ đồng bộ. Một khi bạn đã thực hiện một cuộc gọi không đồng bộ, bạn phải xử lý kết quả một cách không đồng bộ tất cả các cách.

JavaScript là một chuỗi duy nhất, vì vậy nếu bạn tạo vòng lặp chặn chờ kết quả, thì mã sẽ xử lý kết quả sẽ không có cơ hội để chạy.

Nếu bạn muốn trả lại nội dung nào đó từ một hàm không đồng bộ, bạn phải trả lại lời hứa rằng mã gọi có thể sử dụng để xử lý kết quả không đồng bộ.

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