operations.js icon indicating copy to clipboard operation
operations.js copied to clipboard

Accept promises?

Open nickclaw opened this issue 10 years ago • 1 comments

Instead of forcing operations to finish using the done callback, you could check if the work function returns a promise. This way you could cleanly wrap all sorts of logic inside an Operation.

I rewrote a rough draft of the _startSingle function as an example, but I don't understand the codebase enough right now to implement the stuff with queues and composites.

Operation.prototype._startSingle = function() {
    var self = this,
        called = false;

    function payload(payload) {
        self.result = payload;
    }
    function error(err) {
        self.error = err;
    }
    function after() {
        called = true;
        self.completed = true;
        self.running = false;
        self._complete();
    }

    var returned = this.work(function(err, payload) {
        if (called) throw "The operation has already completed.";
        if (err) error(err);
        if (success) success(payload);
        after();
    });

    if (returned && typeof returned.then === 'function') {
        returned.then(success, error).always(after);
    }
}

nickclaw avatar Sep 02 '14 21:09 nickclaw

Neat idea! I was thinking of providing promises as another alternative to the completion and onCompletion event but hadn't thought of this which would tie in nicely!

Let me know if you have any questions on the codebase, I know I could do with adding some comments & tidying up in places ;)

As far as the composites and queues are concerned, I don't think they would require any changes!

The composites just depend on the completion callback of the suboperations (which is called by your draft above via self._complete();) and the queues add their own event handler via onCompletion. So I don't think any changes would be needed anywhere else

mtford90 avatar Sep 02 '14 21:09 mtford90