并發(fā)請(qǐng)求處理:EventProxy

|| 這個(gè)世界上不存在所謂回調(diào)函數(shù)深度嵌套的問題。 —— Jackson Tian

|| 世界上本沒有嵌套回調(diào),寫得人多了,也便有了}}}}}}}}}}}}。 —— fengmk2

API文檔: API Documentation
jscoverage: 97%
源碼注解:注解文檔

EventProxy 僅僅是一個(gè)很輕量的工具,但是能夠帶來一種事件式編程的思維變化。有幾個(gè)特點(diǎn):

  1. 利用事件機(jī)制解耦復(fù)雜業(yè)務(wù)邏輯
  2. 移除被廣為詬病的深度callback嵌套問題
  3. 將串行等待變成并行等待,提升多異步協(xié)作場(chǎng)景下的執(zhí)行效率
  4. 友好的Error handling
  5. 無平臺(tái)依賴,適合前后端,能用于瀏覽器和Node.js
  6. 兼容CMD,AMD以及CommonJS模塊環(huán)境
    現(xiàn)在的,無深度嵌套的,并行的

安裝在這里不過多介紹了,直接進(jìn)去主題

調(diào)用方法

var ep = new EventProxy();
    ep.after('got_resource_details', events.length, function(list) {
        // parse data before callback
        var idx = 0;
        list.forEach(function(it) {
            // add resource url_prefix
            it.forEach(function(one) {
                if (!one) {
                    return;
                }
                var loc = one.location;
                if (loc.indexOf("http") !== 0) {
                    one.location = CONFIG.RES_URL_PREFIX + loc;
                }
            });
            events[idx++].res_list = it;
        });
        // ! RETURN HERE !
        callback(null, events);
    });
    ep.fail(callback);
    var http_prefix = '/' + CONFIG.COLL_NAME_RESOURCE + '/';
    for (var i = 0; i < events.length; i++) {
        epHttpRequestsWithPattern('got_list_resource_details',
            ['name', 'type', 'location', 'duration'],
            events[i].res_list,
            null,  // pattern
            false, // ignore_invalid
            http_prefix,
            module_db_crud_request_headers,
            ep.group('got_resource_details'));
    }

封裝方法

///////////////////////////////////////////////////////////////////////
// UTILS: HTTP requests by EventProxy, WITH SEQUENCE.
//  ep_idname: name of EventProxy
//  items_need: items need to keep in result, others will be delete from result
//  objs: objects list
//  pattern: pattern in objects list which need to be request
//  ignore_invalid: if invalid result need to be ignored?
//  http_prefix: http prefix for requesting
//  callback: callback function
var epHttpRequestsWithPattern = function(ep_idname, items_need, objs, pattern, ignore_invalid, http_prefix, headers, callback) {
    if (ep_idname == undefined || ep_idname == null || ep_idname == "") {
        return callback(null, []);
    }
    if (items_need == undefined || items_need == null || items_need.constructor != Array || items_need.length == 0) {
        return callback(null, []);
    }
    if (objs == undefined || objs == null || objs.constructor != Array || objs.length == 0) {
        return callback(null, []);
    }
    var ep = new EventProxy();
    ep.after(ep_idname, objs.length, function(list) {
        // parse data before callback
        var idx = 0;
        list.forEach(function(it) {
            if (it.statusCode != 200 && ignore_invalid == true) {return;}
            var jdata;
            if (it.statusCode == 200) {
                // parse json string
                try {
                    jdata = JSON.parse(it.body);
                    utils.deleteUselessItem(jdata, items_need);
                } catch (e) {
                    if (ignore_invalid == true) {return;}
                }
            }
            if (pattern) {
                if (jdata) {
                    objs[idx++][pattern] = jdata;
                } else {
                    objs[idx++][pattern] = null;
                }
            } else {
                if (jdata) {
                    objs[idx++] = jdata;
                } else {
                    objs[idx++] = null;
                }
            }
        });
        // ! RETURN HERE !
        callback(null, objs);
    });
    ep.fail(callback);
    for (var i = 0; i < objs.length; i++) {
        var uuid;
        if (pattern) {
            uuid = objs[i][pattern];
        } else {
            uuid = objs[i];
        }
        var api_uri = http_prefix + uuid;
        var cur_timestamp = Math.floor((new Date()).getTime() / 1000);
        var token = utils.generateAccessToken(
            headers.ApiCalleeId
            , headers.ApiAccessKey
            , cur_timestamp, api_uri, '', SECRET_KEY
        );
        var request_headers = {
            ApiRequestType: headers.ApiRequestType,
            ApiCalleeId: headers.ApiCalleeId,
            ApiAccessKey: headers.ApiAccessKey,
            ApiTimestamp: cur_timestamp,
            ApiToken: token,
        };
        // send request to query event details
        request({
            uri: CONFIG.API_ADDRESS + request_headers.ApiCalleeId + api_uri,
            method: "GET",
            timeout: 5000,
            followRedirect: false,
            headers: request_headers,
        }, ep.group(ep_idname));
    }
};

主要解決的問題是在于,針對(duì)數(shù)組中的每個(gè)對(duì)象里面存在我們想要的字段。
需要用到這個(gè)字段來進(jìn)行去請(qǐng)求,才寫出以下方法。

EventProxy原始鏈接

EventProxy原始鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,058評(píng)論 25 709
  • 本文是eventproxy的readme,只是方便我自己偶爾看看的, 這個(gè)世界上不存在所謂回調(diào)函數(shù)深度嵌套的問題。...
    LuciferTM閱讀 5,269評(píng)論 0 2
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。。。 其實(shí)如果沒有APIManager這一層是沒法使用delegate的,畢竟多個(gè)單...
    yhtang閱讀 5,490評(píng)論 1 23
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    前端進(jìn)階之旅閱讀 115,563評(píng)論 24 450
  • 再次提及這個(gè)名字,實(shí)屬無奈,兩年前情緒最為低落之時(shí),我曾在陌陌連載了這個(gè)故事,之所以不說是小說或者文集之類...
    LZY丟閱讀 196評(píng)論 0 0

友情鏈接更多精彩內(nèi)容