新版 js 有了 generatorFunction 和 yield 可以用
但是旧的 Array.prototype.forEach 和 jQuery.each 之类工具并不支持它
结果很多时候只好自己拿 for 写循环
太麻烦了,于是做个工具函数解决这个问题
用法:(需要 ES6 环境,浏览器就别想了,用在 nodejs 上吧)
// 普通的
function () {
asyncEach([ .. ], function (val, key, idx) {
// do your job
});
}
// 异步的
function * () {
yield * asyncEach([ ... ], function * (val, key, idx) {
// do your job
});
}
代码:
function asyncEach(arr, fn) {
if (typeof arr !== 'object') {
return;
}
var isgen = fn instanceof ((function * () { }).constructor),
isarr = typeof arr.length === 'number';
if (isgen) {
var gen = isarr ? function * () {
for (var i = 0, len = arr.length; i < len; i++) {
yield * fn(arr[i], i, i);
}
} : function * () {
var i = 0;
for (var n in arr) {
yield * fn(arr[n], n, i);
i += 1;
}
};
return gen();
} else {
if (isarr) {
for (var i = 0; i < arr.length; i++) {
fn(arr[i], i, i);
}
} else {
var i = 0;
for (var n in arr) {
fn(arr[n], n, i);
i += 1;
}
}
}
};
--
修改:withinsea FROM 123.119.142.58
FROM 123.119.142.58
哦哦,co 支持的类型很多嘛。可以把 Q.spawn 换掉了。
【 在 ttl (小驴) 的大作中提到: 】
: 我写了个lodash的扩展,在co里基本都这个用:
: co(function *() {
: var arr = [1,2,3];
: yield* _.coEach(arr, function *(v, idx) {
: console.log(v);
: yield _.sleep(100);
: });
: var obj = { a: 1, b: 2 };
: yield* _.coEach(obj, function *(v, key) {
: console.log('Field: %s, val: %s', key, v);
: yield _.sleep(100);
: });
: })();
--
FROM 123.119.142.58