异步 ForEach 以映射节点中数组的元素



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

    **EDIT:**

这不起作用:

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);

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

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)
}); 

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

async lib

使用地图的示例。

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)
});

如果您查看map的文档,您将看到它说参数是:

  • 收集
  • 迭代

    功能
    应用于 coll 中每个项的函数。迭代器被传递一个回调(err,已转换),一旦它完成错误(可以是 null)和一个转换项,就必须调用该回调。调用 (项,回调)。

  • 回调

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

我还想包括其他方法可以在没有异步库的情况下做同样的事情:


异步/等待

需要 TypeScript 或 Babel 或带有--harmony标志的 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);

首先,除非你在forEach/map中执行异步操作,否则同步forEach/map会更快。 您的整个代码函数基本上可以转换为console.log(arr.map(member => member+1));

无论如何,在 async.map(...) 中,您必须调用提供的回调函数来指示"异步"进程的结束。

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

最新更新