Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 异步ForEach映射节点中数组的元素_Arrays_Node.js - Fatal编程技术网

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

Arrays 异步ForEach映射节点中数组的元素,arrays,node.js,Arrays,Node.js,目标:我想将数组的所有值设置为(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(n

目标:我想将数组的所有值设置为(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);
这是有效的:

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,为什么它会显示未定义

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

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

首先,除非您在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);
    });
}
异步库

如果您检查,您将看到它显示参数为:

  • 收藏
  • 迭代尔 功能
    应用于coll中每个项的函数。iteratee被传递了一个回调(err,transformed),一旦完成了并带有一个错误(可以为null)和一个转换项,就必须调用该回调。使用(项、回调)调用

  • 回拨
它不适用于简单的
返回
,因为您处理的是异步操作,所以返回将是sync

我还想介绍在不使用异步库的情况下执行相同操作的其他方法:


异步/等待 需要带有
--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);
}());

许诺
您想使用
.map
,而不是
.forEach
,但不管怎样,看一看这个。它有一个示例,演示如何在处理数组后执行操作<代码>元素=4不会改变任何数组元素。这里有一个更简单的例子:
var foo=42;var-bar=foo;巴=21
foo
仍然具有值
42
@FelixKling,我已经使用map编辑了代码,日志中没有打印任何内容。您为什么在这里使用异步库?您不显示任何异步操作。如果您的代码都是同步的,那么异步库就不必要地使事情复杂化了。从文档中可以看出:“迭代对象被传递了一个回调(err,transformed),一旦完成了回调(err,transformed),就必须调用这个回调(err,transformed),并带有一个错误(可能为null)和一个转换项。”因此
function(member){return member+1;}
应该是
函数(member,cb){cb(null,member+1);}
。但是,请注意,如果您不执行任何异步操作,则根本不需要使用
async
。@FelixKling,我只是想习惯async为什么不能使用return而不是console.log(result)?@user7361276,因为异步操作的全部要点是它直接返回,但在后台进行处理。简单地说,当函数(AttemptaSyncEach)返回时,不能假定映射操作的结果可用。为什么要使用
parseInt
?如果您还解释了您的解决方案,您的答案将对其他人更有用。您可能希望补充一点:如果没有额外的构建步骤,
async/await
将无法工作。