2013-06-27 15 views
5

Tôi có câu hỏi về dojo/Deferred. Tôi sẽ bắt đầu với câu hỏi, sau đó đi vào chi tiết hơn về những gì tôi đang làm:Làm thế nào để thực thi mã phổ biến sau khi một đối tượng Dojo trì hoãn được giải quyết hoặc bị từ chối?

Có cách nào để thực thi cùng một dòng mã không phụ thuộc vào kết quả của trì hoãn, loại giống như một khối finally một tuyên bố try...catch? Từ những gì tôi đã đọc, nó không có vẻ như có, nhưng có lẽ tôi hiểu tài liệu sai và muốn xác minh rằng với cộng đồng SO.

Đây là những gì tôi đang làm:

Trong Dojo 1.9 (cũng hoạt động trong 1,8), tôi nhanh chóng một dojox.widget.Standby (một lớp phủ tải) cho một ContentPane trước khi tải một số dữ liệu. Khi cuộc gọi trả lời đã hoàn thành, tôi muốn ẩn lớp phủ của mình như được hiển thị bên dưới:

standby = new Standby({ 
    ... // standby props 
}); 
this.addChild(standby); 
standby.show(); 

queryResults = grid.store.query({ 
    ... // query props 
}); 
queryResults.then(function (results) { 
    if (results) { 
     ... // do something 
    } 

    standby.hide(); 
}, function (error) { 
    ... // handle error 

    standby.hide(); 
}); 

Điều này làm việc tốt; Tuy nhiên, có lẽ, tôi có thể có một số quá trình được thực hiện sau khi hoàn thành trả chậm mà chiếm một số dòng mã thay vì chỉ là một dòng duy nhất và tôi sẽ không muốn lặp lại những dòng mã. Một lựa chọn khác là tạo ra một hàm riêng và chỉ gọi nó với một lớp lót trong mỗi khối, nhưng nếu có cách nào tốt hơn, tôi muốn sử dụng tuyến đó.

Cảm ơn trước!

Trả lời

5

Bạn có thể sử dụng phương thức always của API lời hứa để thực thi một chức năng bất kể thành công hay thất bại bên dưới là Deferred.

queryResult 
    .then(onSuccess, onFailure) 
    .always(function() { 
     standby.hide(); 
    }); 
2

Đây là một câu hỏi hay. Một đối tượng dojo/Deferred sẽ trả về một đối tượng Trì hoãn khác khi gọi Deferred#then. Điều này cho phép bạn tạo chuỗi khác biệt với nhiều cuộc gọi lại được kích hoạt theo thứ tự nối tiếp. Vì vậy, tôi tin rằng bạn có thể làm một cái gì đó như thế này:

queryResults.then(function (results) { 
    if (results) { 
     ... // do something 
    } 
}, function (error) { 
    ... // handle error 
}).then(function(data){ 
    // This will be fired with data returned from the previous callback. 
    standby.hide(); 
}); 

Bạn có thể see this example fiddle minh họa một tương tự, mặc dù trường hợp đơn giản, sử dụng khi không phân biệt nếu thu nhập hoãn lại bị từ chối hoặc giải quyết, gọi lại vào thứ hai Deferred#then là bắn sau khi gọi lại lỗi/thành công ban đầu.

+0

cả quý vị và @Lucas đã trả lời câu hỏi của tôi vì cả hai câu trả lời của bạn là chính xác. Tôi đã đưa ra 'Câu trả lời hay nhất' cho @Lucas bởi vì tôi nghĩ rằng 'luôn luôn' đại diện cho một mục đích rõ ràng hơn so với' bổ sung 'sau đó. Nhưng tôi đã bình chọn cho câu trả lời của bạn về tính chính xác của nó. – David

-1
var deferred = new Deferred(); 
deferred.promise.always(function() { alert('ciao'); }); 
+0

Điều này dường như không thêm bất cứ điều gì trên các câu trả lời hiện có. – Bergi

+0

có nó, bị kéo dài mở rộng lời hứa, vì vậy tôi sử dụng thuộc tính lời hứa mà không cần phải gọi hàm .then() và thiết lập các chức năng gọi lại. – max4ever

+0

Các câu trả lời khác sử dụng '.then()' vì OP cũng cần các hàm gọi lại phụ thuộc vào kết quả. – Bergi

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