2012-09-27 26 views
6

Tôi biết trường hợp sử dụng được đề xuất cho Dojo Deferred là sử dụng dojo.when (def) hoặc def.then() và cung cấp gọi lại cho thời điểm trì hoãn được giải quyết. Tuy nhiên, đôi khi tôi chạy vào scenarious, nơi tôi thực sự cần phải chờ đợi cho rằng hoãn để hoàn thành trước khi tiếp tục với các chủ đề hiện tại. Dưới đây là một ví dụ (hoàn thành ví dụ tại http://jsfiddle.net/DG3Ax/2/)Làm thế nào tôi có thể chặn cho đến khi Dojo Trì hoãn được giải quyết?

function getSomething() { 
    var def = getSomeDeferred(); 

    def.then(function(result) { 
     dojo.place("<li>def.then() = " + result + "</li>", "output"); 
    }); 

    return def.gimmeTheResultNow(); 
} 

dojo.place("<li>getSomething() = " + getSomething() + "</li>", "output"); 

Rõ ràng Deferred.gimmeTheResultNow() không tồn tại, nhưng đó là chức năng mà tôi đang tìm kiếm. Tôi không có quyền kiểm soát của mã gọi getSomething(), vì vậy tôi không thể làm cho nó xử lý một hoãn lại; nó cần kết quả thực sự.

Tôi biết xhrGet() có thông số đồng bộ hóa mà tôi nghĩ sẽ thực hiện công việc nếu đây là cuộc gọi AJAX, nhưng điều đó không nhất thiết phải xảy ra. Có cách nào khác để thực hiện việc này không?

+3

Tôi không biết những gì bạn hoãn lại, nhưng có vẻ như bạn nên loại bỏ nó. Trì hoãn dành cho hành vi không bị chặn, không đồng bộ. – bfavaretto

Trả lời

4

tôi nhận được một very helpful answer khỏi danh sách gửi thư võ đường lãi suất, vì vậy tôi nghĩ rằng tôi muốn dính nó ở đây:

Thật không may, bạn không thể làm điều này trong trình duyệt.

JavaScript trong trình duyệt là một luồng. Nếu bạn đang chờ đợi một Trì hoãn để giải quyết, thì bạn đang sử dụng chuỗi đó. Đây là cùng một chuỗi cần thiết ở một nơi nào đó trên đường dây để thực hiện cuộc gọi tới Deferred.resolve() (chính nó, sau đó sẽ dẫn đến một cuộc gọi đến hàm mà bạn đã chuyển đến .then()).

Bạn có thể gọi đồng bộ xhr vì việc triển khai cơ sở của XHR cho phép bạn gọi đồng bộ. Chức năng của dojo/Deferred chỉ là một trình bao bọc xung quanh nội bộ XHR.

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