使用Jscex的使用问题
发布于 8 年前 作者 tank00 4047 次浏览 最后一次编辑是 4 年前

报错是这样的: [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是个处理函数。

12 回复

我觉得是因为你的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也用不着这么写啊……

回到顶部