2014-06-19 23 views
6

Tôi cần từ chối lời hứa từ bên ngoài cơ thể, để xử lý trường hợp người dùng muốn hủy hành động.Từ chối/Giải quyết lời hứa từ bên ngoài cơ thể

Ở đây, tôi cần phải bắt đầu một số video tải lên cùng một lúc, bằng cách gọi #start trên mọi video tải lên được xếp hàng đợi. Lớp quản lý hàng đợi tải lên sau đó lưu trữ tất cả các lời hứa và sử dụng Ember.RSVP.all để xử lý khi tất cả các lời hứa đã được giải quyết hoặc đã từ chối. Điều này hoạt động tốt.

Bây giờ, tôi muốn hủy bỏ việc tải lên

App.Upload = Ember.Object.extend({ 
    start: function() { 
    var self = this; 

    return new Ember.RSVP.Promise(function(resolve, reject) { 
     self.startUpload() // Async upload with jQuery 
     .then(
      function(resp) { resolve(resp) }, 
      function(error) { reject(error) } 
     ); 
    }); 
    }, 

    cancel: function() { 
    this.get('currentUpload').cancel() // Works, and cancels the upload 
    // Would like to reject the promise here 
    }, 

    startUpload: function() { 
    return this.set('currentUpload', /* some jqXHR that i build to upload */) 
    } 
}); 

Tôi đã nghĩ đến nhiều cách để xử lý nó, nhưng tôi không tìm thấy bất kỳ phương pháp như myPromise.reject(reason).

Vì vậy, những gì tôi đã làm, là để lưu trữ các reject chức năng trong Upload dụ và gọi nó là từ phương pháp cancel của tôi, như thế này:

App.Upload = Ember.Object.extend({ 
    start: function() { 
    var self = this; 

    return new Ember.RSVP.Promise(function(resolve, reject) { 
     /* Store it here */ 
     self.set('rejectUpload', reject); 
     /* ------------- */ 

     self.startUpload() // Async upload with jQuery 
     .then(
      function(resp) { resolve(resp) }, 
      function(error) { reject(error) } 
     ); 
    }); 
    }, 

    cancel: function() { 
    this.get('currentUpload').cancel() // Works, and cancels the upload 

    /* Reject the promise here */ 
    var reject; 
    if (reject = this.get('rejectUpload')) reject(); 
    /* ----------------------- */ 
    }, 

    startUpload: function() { 
    return this.set('currentUpload', /* some jqXHR that i build to upload */) 
    } 
}); 

âm thanh này một chút bẩn với tôi, và tôi muốn để biết nếu có cách nào tốt hơn để thực hiện điều này.

Cảm ơn bạn đã dành thời gian!

+0

Tại sao các bạn gói 'startUpload' với các nhà xây dựng lời hứa? –

+0

Đợi đã, không - điều này là sai về mặt logic (những gì bạn đang làm ở đây), bạn đang tính vào thực tế lời hứa chỉ giải quyết một lần để ngăn chặn các tác dụng phụ và không thực sự hủy việc tải lên. Tôi khuyên bạn nên sử dụng thư viện lời hứa hỗ trợ hủy như Bluebird. –

Trả lời

7
var deferred = Ember.RSVP.defer(); 

deferred.resolve("Success!"); 
deferred.reject("End of the world"); 

Để truy cập vào lời hứa (ví thening vv)

deferred.promise.then(function(){ 
    console.log('all good'); 
},function(){ 
    console.log('all bad'); 
}); 
+0

Xin lỗi vì đã có thời gian trả lời và cảm ơn đề xuất của bạn. Tôi sẽ chấp nhận nó ngay khi tôi thử nghiệm nó vào thứ hai! – Vala

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