报错是这样的: [WARNING] An unhandled error occurred: Error: callback is mandatory 不知道是不是用法有问题。
var dealAsync = eval(Jscex.compile("async", function(){
var tagArr = $await(collection.find({}).toArray());
var tasks = [];
for(x in tagArr){
tasks.push(insertTagImg(tagArr[x]));
}
$await(Jscex.Async.Task.whenAll(tasks));
}));
dealAsync().start();
其中insertTagImg是个处理函数。
我觉得是因为你的collection.find({}).toArray()
不是一个Jscex异步操作啊。
确实是我自己的问题。刚开始不知道要封装成Jscex异步操作函数。
@tank00 好说好说,有问题继续问那。
@jeffz 我在Jscex异步方法内写了代码如下:
for(x in tagArr){
var buf = $await(imgFindAsync(tagArr[x]));
if(!buf){
console.log('buf is null!');
continue;
}
var features = $await(identifyAsync(buf));
var result = $await(imgInsertAsync(tagArr[x],tagArr[x],buf,features));
var tasks = [];
for(x in unit){
tasks.push(resizeAsync(buf,result[0]._id,unit[x]));
}
$await(Jscex.Async.Task.whenAll(tasks));
$await(updateTagAsync(tagArr[x]._id,result[0]._id));
}
但是实际运行的话,最后一个调用tagArr[x]._id的使用这个值始终一样。我猜测应该都是最后一个值,这应该是异步的使用使用循环变量的问题。 所以我的问题是,如果我要多次用到这个循环变量,除了第一次调用之外截下来的调用,是不是必须一层层的把这个值callback回来。否则我调用的时候永远是最后一个值
@jeffz 好像是不是这样就可以了。
for(x in tagArr){
var tagdata = tagArr[x];
var buf = $await(imgFindAsync(tagdata));
if(!buf){
console.log('buf is null!');
continue;
}
var features = $await(identifyAsync(buf));
var result = $await(imgInsertAsync(tagdata,buf,features));
var tasks = [];
for(x in unit){
tasks.push(resizeAsync(buf,result[0]._id,unit[x]));
}
$await(Jscex.Async.Task.whenAll(tasks));
$await(updateTagAsync(tagdata._id,result[0]._id));
}
@tank00 你的x为什么用在两个循环里?
@jeffz 笔误了。第二层循环用的是i。
@tank00 给一个正确的代码吧,然后把问题描述清楚。
@jeffz 这几天总结一下,写一个好一点的帖子。现在这个是问题贴。我的主要问题要串行处理6000多张图片,使用nodejs写脚本,每次处理涉及到imagemagick和数据库操作。直接for循环并行的话内存,子进程太多无法解决,必须是深度的6000多层嵌套。
@tank00 靠,就算串行处理也不用硬写6000层的嵌套啊……
@jeffz 所用jscex啊
@tank00 我是说不用Jscex也用不着这么写啊……