当前位置: 首页 > 工具软件 > ClayGL > 使用案例 >

2021SC@SDUSC山东大学软件学院软件工程应用与实践——claygl(源代码分析6)

昝浩阔
2023-12-01

2021SC@SDUSC

目录

一.clay.async.Task类概述

二.clay.async.Task类的作用

三.clay.async.Task类源码分析(一)

1.new Task()

2.(static) makeRequestTask(url, responseType opt) → {clay.async.Task|Array.}

3.(static) makeTask() → {clay.async.Task}

4.after(name, action, context opt)

5.before(name, action, context opt)

6.error(action, context opt)

7.has(name, action) → {boolean}

8.isFullfilled() → {boolean}

9.isRejected() → {boolean}

10.isSettled() → {boolean}


一.clay.async.Task类概述

    clay.async.Task类是对异步任务的处理,从而处理claygl中有关的任务。

二.clay.async.Task类的作用

    clay.async.Task类能够处理异步任务,包括接收任务,创建任务,设置任务发生前后,事件出错时所触发的事件,以及判断任务是否完成,及其成功或失败,并且可以判断有无该任务等

三.clay.async.Task类源码分析(一)

1.new Task()

    该函数为Task类的构造函数,无参数

    其源代码如下:

function Task() {
    this._fullfilled = false;
    this._rejected = false;
}

    从源代码可以看出,Task类内部有两个成员变量,即_fullfilled和_rejected,当对象构造时,两个成员变量会被初始化,并赋值false。

2.(static) makeRequestTask(url, responseType opt) → {clay.async.Task|Array.<clay.async.Task>}

    该函数的作用是创建一个vendor.request任务。

    参数有url和responseType,url的类型为string或object或Array.<object>或Array.<string>,responseType的类型为string

    其源代码为:

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

    从源代码中可以看出,该函数首先判断url的类型是否为string,若是则执行makeRequestTask(url, responseType),makeRequestTask(url, responseType)的代码如下:

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

    该函数首先创建一个Task对象,并赋值给task局部变量,接着调用vendor.request.get方法,其中接收的url为形参的url,接收的responseType为形参的responseType,onload方法执行调用task的resolve方法,表示处理资源,onerror方法执行调用task的reject方法,表示处理错误异常。最后返回task对象。

    若url的类型为对象,则将url赋值给新建的对象obj,继续执行makeRequestTask(obj.url, obj.responseType)方法,形参为obj的url和responseType。

     若url为数组,则创建一个urlList并赋值url,同时创建一个tasks数组,对urlList中的每个对象进行遍历,创建url和responseType局部变量,若obj的类型为string,则将obj赋值给url,若为对象,则将obj的url赋值给url,将obj的respType赋值给responseType。

    最后,执行makeRequestTask(url, responseType)方法,并将返回值加入到tasks数组中,并返回tasks数组。

3.(static) makeTask() → {clay.async.Task}

    该函数的作用是创建一个task任务,为静态类型,可直接调用。

    无参数。

    其源代码为:

Task.makeTask = function() {
    return new Task();
}

    该函数创建一个Task对象并返回该对象。

4.after(name, action, context opt)

    该函数的作用是设置事件触发后的动作。

    参数为name,类型为string,表示事件触发后的动作的名称,action,类型为function,表示事件触发后的动作的函数,context,类型为object,表示事件触发后的动作的内容。

    其源代码如下:

 after: function(name, action, context) {
        if (!name || !action) {
            return;
        }
        name = 'after' + name;
        return this.on(name, action, context);
    }

    从源代码中可以看出,该函数首先判断name和action是否存在,若其中一个不存在,则直接返回,若存在,则在name前加入字符串‘after’,并调用本对象的on(name, action, context)方法,从而实现事件触发后的动作

5.before(name, action, context opt)

    该函数的作用是设置事件触发前的动作。

    参数为name,类型为string,表示事件触发前的动作的名称,action,类型为function,表示事件触发前的动作的函数,context,类型为object,表示事件触发前的动作的内容。

    其源代码如下:

before: function(name, action, context) {
        if (!name || !action) {
            return;
        }
        name = 'before' + name;
        return this.on(name, action, context);
    }

    从源代码中可以看出,该函数首先判断name和action是否存在,若其中一个不存在,则直接返回,若存在,则在name前加入字符串‘before’,并调用本对象的on(name, action, context)方法,从而实现事件触发前的动作

6.error(action, context opt)

    该函数的作用是设置事件发生错误触发的动作。

    action,类型为function,表示事件发生错误触发的函数,context,类型为object,表示事件发生错误触发的内容。

    其源代码如下:

error: function(action, context) {
        return this.once('error', action, context);
    }

    从源代码中可以看出,该函数直接调用本对象的once方法,name为‘error’,另外两个参数为方法的形参,从而实现错误的处理。

7.has(name, action) → {boolean}

    该函数的作用是判断是否注册事件驱动程序。

    参数为name,类型为string,表示事件的名称,action,类型为function,表示事件执行的方法。

    其源代码如下:

has: function(name, action) {
        var handlers = this.__handlers__;
        if (! handlers ||
            ! handlers[name]) {
            return false;
        }
        var hdls = handlers[name];
        for (var i = 0; i < hdls.length; i++) {
            if (hdls[i].action === action) {
                return true;
            }
        }
    }

    从源代码可以看出,首先将本对象的__handlers__成员变量赋值给新建的对象handlers,判断handlers是否存在和handlers中是否存在name的对象,若其中一个条件不满足,则返回false。接着,将handlers中名为name的对象赋给新变量hdls,对hdls进行遍历,若hdls中某一对象的action与形参的action相同,则返回true,从而判断name对象是否有action方法,进而判断是否注册事件驱动程序。

8.isFullfilled() → {boolean}

    该函数判断任务是否成功。

    无参数。

    其源代码如下:

Task.prototype.isFullfilled = function() {
    return this._fullfilled;
}

    该函数返回本对象的_fullfilled成员变量。

9.isRejected() → {boolean}

    该函数判断任务是否失败。

    无参数。

    其源代码如下:

Task.prototype.isRejected = function() {
    return this._rejected;
}

    该函数返回本对象的_rejected成员变量。

10.isSettled() → {boolean}

    该函数判断任务是否完成,即要么失败,要么成功。

    无参数。

    其源代码如下:

Task.prototype.isSettled = function() {
    return this._fullfilled || this._rejected;
}

    该函数返回本对象的_rejected和_fullfilled成员变量的或。

 类似资料: