拒绝/解决身体外的承诺

Val*_*ala 6 promise cancellation ember.js

我需要拒绝来自其身体外的承诺,以处理想要取消操作的用户的情况.

在这里,我需要通过在每个排队的上传中调用#start来同时启动多个上传.管理上传队列的类然后存储所有承诺和用于Ember.RSVP.all处理所有承诺已解决或拒绝的承诺.这很好用.

现在,我想取消上传

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 */)
  }
});
Run Code Online (Sandbox Code Playgroud)

我已经想到了很多方法来处理它,但我没有找到任何方法myPromise.reject(reason).

所以我做的是将reject函数存储在Upload实例中并从我的cancel方法中调用它,如下所示:

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 */)
  }
});
Run Code Online (Sandbox Code Playgroud)

这听起来有点脏,我想知道是否有更好的方法来做到这一点.

谢谢你的时间 !

Kin*_*n2k 7

var deferred = Ember.RSVP.defer();

deferred.resolve("Success!");
deferred.reject("End of the world");
Run Code Online (Sandbox Code Playgroud)

获取承诺(用于等等)

deferred.promise.then(function(){
  console.log('all good');
},function(){
  console.log('all bad');
});
Run Code Online (Sandbox Code Playgroud)