|| 這個(gè)世界上不存在所謂回調(diào)函數(shù)深度嵌套的問題。 —— Jackson Tian
|| 世界上本沒有嵌套回調(diào),寫得人多了,也便有了}}}}}}}}}}}}。 —— fengmk2
API文檔: API Documentation
jscoverage: 97%
源碼注解:注解文檔
EventProxy 僅僅是一個(gè)很輕量的工具,但是能夠帶來一種事件式編程的思維變化。有幾個(gè)特點(diǎn):
- 利用事件機(jī)制解耦復(fù)雜業(yè)務(wù)邏輯
- 移除被廣為詬病的深度callback嵌套問題
- 將串行等待變成并行等待,提升多異步協(xié)作場(chǎng)景下的執(zhí)行效率
- 友好的Error handling
- 無平臺(tái)依賴,適合前后端,能用于瀏覽器和Node.js
- 兼容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)求,才寫出以下方法。