import notifier from '../core/mixin/notifier';
import vendor from '../core/vendor';
import util from '../core/util';
/**
* @constructor
* @alias clay.async.Task
* @mixes clay.core.mixin.notifier
*/
function Task() {
this._fullfilled = false;
this._rejected = false;
};
/**
* Task successed
* @param {} data
*/
Task.prototype.resolve = function(data) {
this._fullfilled = true;
this._rejected = false;
this.trigger('success', data);
};
/**
* Task failed
* @param {} err
*/
Task.prototype.reject = function(err) {
this._rejected = true;
this._fullfilled = false;
this.trigger('error', err);
};
/**
* If task successed
* @return {boolean}
*/
Task.prototype.isFullfilled = function() {
return this._fullfilled;
};
/**
* If task failed
* @return {boolean}
*/
Task.prototype.isRejected = function() {
return this._rejected;
};
/**
* If task finished, either successed or failed
* @return {boolean}
*/
Task.prototype.isSettled = function() {
return this._fullfilled || this._rejected;
};
util.extend(Task.prototype, notifier);
function makeRequestTask(url, responseType) {
var task = new Task();
vendor.request.get({
url: url,
responseType: responseType,
onload: function(res) {
task.resolve(res);
},
onerror: function(error) {
task.reject(error);
}
});
return task;
}
/**
* Make a vendor.request task
* @param {string|object|object[]|string[]} url
* @param {string} [responseType]
* @example
* var task = Task.makeRequestTask('./a.json');
* var task = Task.makeRequestTask({
* url: 'b.bin',
* responseType: 'arraybuffer'
* });
* var tasks = Task.makeRequestTask(['./a.json', './b.json']);
* var tasks = Task.makeRequestTask([
* {url: 'a.json'},
* {url: 'b.bin', responseType: 'arraybuffer'}
* ]);
* @return {clay.async.Task|clay.async.Task[]}
*/
Task.makeRequestTask = function(url, responseType) {
if (typeof url === 'string') {
return makeRequestTask(url, responseType);
}
else if (url.url) { // Configure object
var obj = url;
return makeRequestTask(obj.url, obj.responseType);
}
else if (Array.isArray(url)) { // Url list
var urlList = url;
var tasks = [];
urlList.forEach(function(obj) {
var url, responseType;
if (typeof obj === 'string') {
url = obj;
}
else if (Object(obj) === obj) {
url = obj.url;
responseType = obj.responseType;
}
tasks.push(makeRequestTask(url, responseType));
});
return tasks;
}
};
/**
* @return {clay.async.Task}
*/
Task.makeTask = function() {
return new Task();
};
util.extend(Task.prototype, notifier);
export default Task;