VanDalkvist
4/6/2016 - 8:38 AM

Timeout on promises with cancelling support

Timeout on promises with cancelling support

function _handleDeferred(deferred, result) {
    if (!result || !result.then) {
        // just to wrap objects which have no promises
        deferred.resolve();
    } else result.then(function (res) {
        deferred.resolve(res);
    }, function (err) {
        deferred.reject(err);
    }).catch(function (err) {
        deferred.reject(err);
    });
}
function startOnce(callback, delay) {
    var delayed = Q.delay(delay);
  
    var deferred = Q.defer();
    delayed.then(deferred.resolve);
  
    var promise = deferred.promise.then(function () {
        _handleDeferred(deferred, callback());
    }, function (res) {
        if (!res.cancelled) throw res;
    });
    promise.cancel = function _cancel() {
        deferred.reject({ cancelled: true });
    };
    return promise;
}