CNode

使用Jscex的使用问题

Ttank00发布于14 年前最后回复14 年前12 回复6097 浏览0 收藏

报错是这样的: [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)

J
jeffz#1·14 年前
引用 jeffz我觉得是因为你的collection.find({}).toArray()不是一个Jscex异步操作啊。

@tank00 靠,就算串行处理也不用硬写6000层的嵌套啊……

J
jeffz#2·14 年前

我觉得是因为你的collection.find({}).toArray()不是一个Jscex异步操作啊。

T
tank00#3·14 年前
引用 jeffz我觉得是因为你的collection.find({}).toArray()不是一个Jscex异步操作啊。

确实是我自己的问题。刚开始不知道要封装成Jscex异步操作函数。

J
jeffz#4·14 年前
T
tank00#5·14 年前
引用 jeffz我觉得是因为你的collection.find({}).toArray()不是一个Jscex异步操作啊。

@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回来。否则我调用的时候永远是最后一个值

T
tank00#6·14 年前
引用 jeffz我觉得是因为你的collection.find({}).toArray()不是一个Jscex异步操作啊。

@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));
    }
J
jeffz#7·14 年前
T
tank00#8·14 年前
J
jeffz#9·14 年前
引用 jeffz我觉得是因为你的collection.find({}).toArray()不是一个Jscex异步操作啊。

@tank00 给一个正确的代码吧,然后把问题描述清楚。

T
tank00#10·14 年前
引用 jeffz我觉得是因为你的collection.find({}).toArray()不是一个Jscex异步操作啊。

@jeffz 这几天总结一下,写一个好一点的帖子。现在这个是问题贴。我的主要问题要串行处理6000多张图片,使用nodejs写脚本,每次处理涉及到imagemagick和数据库操作。直接for循环并行的话内存,子进程太多无法解决,必须是深度的6000多层嵌套。

J
jeffz#12·14 年前
引用 jeffz我觉得是因为你的collection.find({}).toArray()不是一个Jscex异步操作啊。

@tank00 我是说不用Jscex也用不着这么写啊……

参与回复
登录后即可参与回复。登录