coordinator-node-client
Version:
分布式协调服务node客户端,用于获取微服务的可用地址,参照eureka-js-client.
151 lines (135 loc) • 4.54 kB
JavaScript
/**
* Copyright (c) 2010-2015 EEFUNG Software Co.Ltd. All rights reserved.
* 版权所有 (c) 2010-2015 湖南蚁坊软件有限公司。保留所有权利。
* Created by liwenjun on 2016/4/14.
*/
(function () {
var async = {
logger: null
};
//仿async, https://github.com/caolan/async
//// cross-browser compatiblity functions ////
var _toString = Object.prototype.toString;
var _isArray = Array.isArray || function (obj) {
return _toString.call(obj) === '[object Array]';
};
function _isArrayLike(arr) {
return _isArray(arr) || (
// has a positive integer length property
typeof arr.length === "number" &&
arr.length >= 0 &&
arr.length % 1 === 0
);
}
// capture the global reference to guard against fakeTimer mocks
var _setImmediate = typeof setImmediate === 'function' && setImmediate;
var _delay = _setImmediate ? function (fn) {
// not a direct alias for IE10 compatibility
_setImmediate(fn);
} : function (fn) {
setTimeout(fn, 0);
};
if (typeof process === 'object' && typeof process.nextTick === 'function') {
async.nextTick = process.nextTick;
} else {
async.nextTick = _delay;
}
async.setImmediate = _setImmediate ? _delay : async.nextTick;
function _keyIterator(coll) {
var i = -1;
var len;
var keys;
if (_isArrayLike(coll)) {
len = coll.length;
return function next() {
i++;
return i < len ? i : null;
};
} else {
keys = _keys(coll);
len = keys.length;
return function next() {
i++;
return i < len ? keys[i] : null;
};
}
}
var _keys = Object.keys || function (obj) {
var keys = [];
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
keys.push(k);
}
}
return keys;
};
async.setLogger = function (logger) {
async.logger = logger;
};
async.eachOfSeries = function (urls, fn, callback) {
callback = _once(callback || noop);
urls = urls || [];
var nextKey = _keyIterator(urls);
var key = nextKey();
function iterate() {
function innercallback(err, httpResponse, body) {
if (err) {
key = nextKey();
if (key === null) {
if (async.logger) {
async.logger.debug("协调中心没有可用服务!");
}
//返回错误信息
callback(err, httpResponse, body);
} else {
//立即执行
iterate();
}
} else {
//返回正确信息
callback(err, httpResponse, body);
}
}
if (key === null) {
if (async.logger) {
async.logger.debug("协调中心没有可用服务!");
}
callback(new Error("协调中心没有可用服务!"));
} else {
if (async.logger) {
async.logger.debug("调用第" + (key + 1) + "个服务实例:" + urls[key]);
}
fn(urls[key], innercallback);
}
}
iterate();
};
function only_once(fn) {
return function () {
if (fn === null) throw new Error("Callback was already called.");
fn.apply(this, arguments);
fn = null;
};
}
function _once(fn) {
return function () {
if (fn === null) return;
fn.apply(this, arguments);
fn = null;
};
}
// Node.js
if (typeof module === 'object' && module.exports) {
module.exports = async;
}
// AMD / RequireJS
else if (typeof define === 'function' && define.amd) {
define([], function () {
return async;
});
}
// included directly via <script> tag
else {
root.async = async;
}
}());