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