Async ForEach用于映射Node中的数组元素

时间:2017-01-02 23:33:57

标签: arrays node.js

目标:我想将数组的所有值设置为(valueofIndex + 1)并最后记录新数组。

    **EDIT:**

这个DOESNT工作:

var async = require('async');

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

function attemptAtAsyncEach (arr) {

    return async.map(arr, function (member, callback) {
        callback(null, member + 1);
    }, function (err, results) {
        return results;
    });
}

console.log(attemptAtAsyncEach(arr));

这项工作:

var async = require('async');

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

function attemptAtAsyncEach (arr) {

    return async.map(arr, function (member, callback) {
        callback(null, member + 1);
    }, function (err, results) {
        console.log( results);
    });
}

attemptAtAsyncEach(arr);

如果我在回调中返回结果而不是console.log,为什么它显示未定义?

3 个答案:

答案 0 :(得分:1)

var async = require('async')

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

async.forEach(Object.keys(arr), function (i, callback){
    // if you mean: value of the index + 1
    arr[i] = parseInt(i) + 1
    // OR if you mean: value at the index + 1
    arr[i] += 1

    callback()
}, function(err) {
    console.log(arr)
}); 

注意:为了获取您要编辑的元素的索引,您传递数组的键而不是数组。键是字符串,因此您需要解析它。

答案 1 :(得分:1)

async lib

Example using map

var async = require('async')

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

async.map(arr, function (i, callback) {
    callback(null, i + 10);
}, function(err, result) {
    console.log(result)
});

如果您检查documentation on map,您会看到参数为:

  • 集合
  • iteratee
      

    功能
      一个应用于coll中每个项目的函数。迭代器传递一个回调(错误,转换),一旦完成并且有错误(可以为null)和转换项,就必须调用它。用(item,callback)调用。

  • 回调

它不适用于简单的return,因为您正在处理异步操作,返回将是同步。

我还想在没有async lib的情况下包含其他方法来做同样的事情:

Async / await

需要带有--harmony标记的TypeScript或Babel或Node 7+。

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

(async function () {
  var x = await Promise.all(arr.map(i => new Promise(r => r(i + 10))));
  console.log(x);
}());

无极

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

Promise.all(arr.map(i => new Promise(r => r(i + 10))))
  .then(console.log);

答案 2 :(得分:0)

First of all, unless you are doing asynchronous operations inside your forEach/map a synchronous forEach/map will be quicker. Your entire code function essentially translates to console.log(arr.map(member => member+1));

Anyway, inside an async.map(...), you must call the provided callback function to indicate the end of your 'asynchronous' process.

function attemptAtAsyncEach (arr) {
    return async.map(arr, function (member, callback) {
        callback(null, member+1);
    }, function (err, result) {
        console.log(result);
    });
}