Почему async.map возвращает несколько копий массива?

#javascript #node.js #asynchronous #async-await #async.js

#javascript #node.js #асинхронный #async-ожидание #async.js

Вопрос:

 const async = require('async');

const arr = [
    { name: 'john', id: '1' },
    { name: 'Andrie', id: '2' }]

let collectArr = [];
let data = async.mapLimit(arr, 5, async function (input) {

    collectArr.push({ name: input.name, id: input.id });
    return collectArr;
})

data.then((result) =>{
    console.log('success',result);
}).catch(e => console.log('err'));
  

Итак, здесь я предоставляю массив async.mapLimit без обратного вызова и ожидаю обещания здесь.
Ожидаемый результат: — [ { имя: ‘john’, id: ‘1’ }, { имя: ‘Andrie’, id: ‘2’ } ] ,

Получен результат :-

[ [ { имя: ‘john’, идентификатор: ‘1’ }, { имя: ‘Andrie’, идентификатор: ‘2’ } ], [ { имя: ‘john’, идентификатор: ‘1’ }, { имя: ‘Andrie’, идентификатор: ‘2’ } ]]

Итак, мой вопрос в том, почему он создает несколько копий массива, как с этим бороться?

Ответ №1:

Вы без необходимости возвращаете вложенный массив, и один и тот же массив ссылается на каждую итерацию, когда все, что вы хотите, это вернуть новый объект.

 let data = async.mapLimit(arr, 5, async function (input) {
    return { name: input.name, id: input.id };   
});
  

Не уверен, зачем вам нужно, чтобы это было асинхронным

Комментарии:

1. Можете ли вы предоставить несколько руководств по асинхронности, потому что я не могу найти его там, где описана вся информация. Официальные документы не так уж хороши

2. Я никогда не использовал эту библиотеку, но концепция такая же, как у Array#map(), с небольшой разницей для аргумента limit

3. Хорошо, я пройдусь по карте и проверю ее