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;
}