2014-06-19 3 views
6

Ich muss ein Versprechen von außerhalb seines Körpers ablehnen, um den Fall des Benutzers zu behandeln, der die Aktion abbrechen wollte.Ein Versprechen von außerhalb des Körpers ablehnen/lösen

Hier muss ich mehrere Uploads gleichzeitig starten, indem ich #start bei jedem Upload in der Warteschlange anrufe. Die Klasse, die die Upload-Warteschlange verwaltet, speichert dann alle Versprechungen und verwendet Ember.RSVP.all, um zu verarbeiten, wenn alle Versprechen gelöst oder abgelehnt wurden. Das funktioniert gut.

Nun würde Ich mag den Upload

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 */) 
    } 
}); 

ich gedacht habe abbrechen von vielen Möglichkeiten, es zu handhaben, aber ich habe keine Methode, wie myPromise.reject(reason) gefunden.

Also, was ich tat, ist die reject Funktion in der Upload Instanz zu speichern und sie von meinem cancel Methode aufrufen, wie folgt aus:

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 */) 
    } 
}); 

Dieser Sound ein bisschen schmutzig zu mir, und ich möchte zu wissen, ob es einen besseren Weg gab, dies zu machen.

Danke für Ihre Zeit!

+0

Warum Sie mit dem Versprechen Konstruktor 'startUpload' wickeln? –

+0

Warte, nein - das ist logisch falsch (was du hier machst), du zählst auf die Tatsache, dass Versprechungen nur einmal gelöst werden, um die Nebenwirkungen zu verhindern und den Upload nicht wirklich abzubrechen. Ich empfehle, dass Sie eine Versprechens-Bibliothek verwenden, die die Löschung wie Bluebird unterstützt. –

Antwort

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

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

Um das Versprechen Zugang (für Thening etc)

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

Entschuldigung für die Zeit zurück zu antworten und danke für Ihren Vorschlag. Ich werde es akzeptieren, sobald ich es am Montag getestet habe! – Vala