2012-08-22 37 views
15

Tôi đang viết một trình phân tích cú pháp được rải rác bằng Công việc không đồng bộ. Tôi sử dụng lời hứa JQuery để kiểm soát và sắp xếp các tác vụ không đồng bộ. Đây là một phiên bản mã giả của hàm constructor:

/** 
    * @constructor 
    */ 
    function Parser(json) 
    { 
     return $.when(
      this.delete().then(this.insert(json)), 
      this.doSomething(), 
      this.doSomethingElse().then(this.update(json)) 
     ) 
    }; 

và đây là những gì một chức năng ví dụ trông giống như:

Parser.prototype.doSomething = function() 
{ 
    var dfd = $.Deferred(); 

    exampleTask(dfd.reject, dfd.resolve); 

    return dfd.promise(); 
}; 

Từ các tài liệu JQuery:

Trong trường hợp nhiều đối tượng trì hoãn được chuyển đến jQuery.when, phương thức trả về Lời hứa từ đối tượng Trì hoãn "chính" mới theo dõi trạng thái tổng hợp của tất cả các Trì hoãn mà nó có een được thông qua

Làm cách nào để sử dụng .progress() để thông báo cho bất kỳ ai quan tâm đến tiến trình tổng thể của Trình phân tích cú pháp? ví dụ:

var parser = new Parser(json); 
parser.progress(function(prog){console.log(prog}); 

Heres một fiddle với những gì tôi đang cố gắng để làm: http://jsfiddle.net/ashanova/RjULA/2/

Trả lời

14

Sử dụng deferred.notify() gọi progressCallbacks. Ví dụ:

function doSomething() { 
    var dfd = $.Deferred(); 

    var count = 0; 
    var intervalId = setInterval(function() { 
     dfd.notify(count++); 
     count > 3 && clearInterval(intervalId); 
    }, 500); 

    return dfd.promise(); 
}; 

var promise = doSomething(); 

promise.progress(function(prog) { 
    console.log(prog); 
});​ 

DEMO.

+0

Tôi đã tìm hiểu cách sử dụng. Chú thích trong một hàm (như trong bản trình diễn của bạn), nhưng tôi muốn chuyển nó trở lại cho hàm tạo và thông báo cho tiến trình tổng thể từ đó. Tôi muốn xem nơi phân tích cú pháp là tổng thể, không phải chức năng của nó - nếu bạn theo tôi? – JonWells

+0

@Jaoa như thế này: http://jsfiddle.net/ashanova/RjULA/2/ – JonWells

+0

@CrimsonChin: Không chắc chắn nếu tôi đã hiểu câu hỏi của bạn một cách chính xác, nhưng trong trường hợp đó, bạn cần phải tạo và lưu trữ một tham chiếu với '$ .Deferred' trong hàm tạo của bạn, để bạn có thể gọi' notify' trong mỗi phương thức. Một cái gì đó dọc theo những dòng này: http://jsfiddle.net/B7nzy/ –