- 主题:支持 generator 的 foreach
新版 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
各个浏览器对yield的兼容怎么样?
我觉得coroutine在界面开发领域很好用。
【 在 withinsea (在这个大喜的日子里,我们感到万分悲痛) 的大作中提到: 】
: 新版 js 有了 generatorFunction 和 yield 可以用
: 但是旧的 Array.prototype.forEach 和 jQuery.each 之类工具并不支持它
: 结果很多时候只好自己拿 for 写循环
: ...................
--
FROM 27.154.194.*
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 各个浏览器对yield的兼容怎么样?
基本上只能呵呵~~
: 我觉得coroutine在界面开发领域很好用。
--
FROM 124.202.190.*
我记得几年前就看到yield这个语法了,居然到现在还不支持。
【 在 ttl (小驴) 的大作中提到: 】
: 基本上只能呵呵~~
--
FROM 27.154.194.*
我写了个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);
});
})();
【 在 withinsea (在这个大喜的日子里,我们感到万分悲痛) 的大作中提到: 】
: 新版 js 有了 generatorFunction 和 yield 可以用
: 但是旧的 Array.prototype.forEach 和 jQuery.each 之类工具并不支持它
: 结果很多时候只好自己拿 for 写循环
: ...................
--
FROM 124.202.190.*
光看看ie8-的量就~~~~
移动设备相对情况比较好。
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 我记得几年前就看到yield这个语法了,居然到现在还不支持。
--
FROM 124.202.190.*
哦哦,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
恩,看起来co是最流行的一个了
【 在 withinsea 的大作中提到: 】
: 哦哦,co 支持的类型很多嘛。可以把 Q.spawn 换掉了。
:
--
FROM 61.148.244.*