async.concat()之后的Node.js concat数组

时间:2013-07-17 14:08:49

标签: javascript node.js async.js

我有一个数组,我需要使用一些编辑重新编译。我是在async.concat()的帮助下完成的,但有些东西不起作用。 告诉我,错误在哪里?

async.concat(dialogs, function(dialog, callback) {
    if (dialog['viewer']['user_profile_image'] != null) {
        fs.exists(IM.pathToUserImage + dialog['viewer']['user_profile_image'].replace('%s', ''), function(exits) {
            if (exits) {
                dialog['viewer']['user_profile_image'] = dialog['viewer']['user_profile_image'].replace('%s', '');
            }
            callback(dialog);
        });
    }
}, function() {
    console.log(arguments);
});

在我看来,一切都是合乎逻辑的。第一次迭代后立即调用回调。但是,如何在完成整个阵列的处理后发送数据呢?

谢谢!

3 个答案:

答案 0 :(得分:3)

而不是callback(dialog);,你想要

callback(null,dialog);

因为回调函数的第一个参数是错误对象。在第一次迭代后调用console.log(arguments)的原因是因为async认为发生了错误。

答案 1 :(得分:1)

我解决了这个问题但却没有理解它的含义。问题是由于元素为null而不是处理值。该程序此时已中断,但不要丢弃任何错误/警告。

async.map(dialogs, function(dialog, callback) {
    if (dialog['viewer']['user_profile_image'] == null) {
        dialog['viewer']['user_profile_image'] = IM.pathToUserImage;
    }
    fs.exists(IM.pathToUserImage + dialog['viewer']['user_profile_image'].replace('%s', ''), function(exits) {
        if (exits) {
            dialog['viewer']['user_profile_image'] = dialog['viewer']['user_profile_image'].replace('%s', '');
        }
        callback(null, dialog);
    });
}, function(err, rows) {
    if (err) throw err;
    console.log(rows);
});

答案 2 :(得分:0)

尽管我发布这个答案有点晚了,但我发现我们当中没有人以应有的方式使用.concat函数。

我创建了一个片段,说明该功能的正确实现。

let async = require('async');
async.concat([1, 2, 3], hello, (err, result) => {
    if (err) throw err;
    console.log(result); // [1, 3]
});

function hello(time, callback) {
    setTimeout(function () {
        callback(time, null)
    }, time * 500);
}