Прохождение цикла for с последующим вызовом функции JS

Aug 19 2020

Поэтому я не могу заставить его отказаться от почтальона более чем одним объектом. когда я console.log, я получаю все объекты массива (боевые метки, которые вынуты и заменены на игрока)

        router.get('/cod/', (req, res) => {
        const pdata = {}
        console.log(req.params)
        API.login(process.env.EMAIL, process.env.PASSWORD).then((output) => {
       
        // Players array,
        players = ['player1', 'player2', 'player3']
        // map through array and create promise for each player and store it in an array
        promises = players.map(player => API.MWBattleData(player))
        // Pass all promises to Promise.all
        // Result will be an array of individual output of each promise
        Promise.all(promises)
            .then(result => {
                // Loop through result, and assign the output to pdata
                result.forEach((output, index) => {
                    // index + 1 because starting index will be zero
                    pdata[`p${index + 1}`] = output
                    res.json(pdata);
                })
            })
         })
         });

Я получаю сообщение об ошибке в узле консоли: 19134) UnhandledPromiseRejectionWarning: Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту на ServerResponse.setHeader (_http_outgoing.js: 518: 11) в ServerResponse.chau (/ Users / jared Desktop / cod-tracker / node_modules / express / lib / response.js: 771: 10) на ServerResponse.send (/Users/jaredschau/Desktop/cod-tracker/node_modules/express/lib/response.js:170:12) в ServerResponse.json (/Users/jaredschau/Desktop/cod-tracker/node_modules/express/lib/response.js:267:15) в /Users/jaredschau/Desktop/cod-tracker/routes/posts.js:29: 25 в Array.forEach () в /Users/jaredschau/Desktop/cod-tracker/routes/posts.js:26:24 в processTicksAndRejection (internal / process / task_queues.js: 97: 5) (узел: 19134) UnhandledPromiseRejectionWarning: Необработанный отказ от обещания.Эта ошибка возникла либо из-за вызова асинхронной функции без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch (). Чтобы завершить процесс узла при отклонении необработанного обещания, используйте флаг CLI--unhandled-rejections=strict(см. https://nodejs.org/api/cli.html#cli_unhandled_rejection_mode). (идентификатор отказа: 1) (узел: 19134) [DEP0018] DeprecationWarning: необработанные отклонения обещаний устарели. В будущем необработанные отклонения обещаний завершат процесс Node.js с ненулевым кодом выхода.

Ответы

1 Kumar Aug 19 2020 at 10:05

Похоже, API.MWBattleData('Player1')возвращает обещание. Затем вы можете достичь этого с помощью Promise.all, который последовательно разрешит все обещания и вернет вам массив результатов для всех обещаний.

// Players array,
players = ['player1', 'player2', 'player3', ...]

// map through array and create promise for each player and store it in an array
promises = players.map(player => API.MWBattleData(player))

// Pass all promises to Promise.allSettled
Promise.allSettled(promises)
  .then(result => { // Result will be an array of individual output of each promise

    // Loop through result, and assign the output to pdata
    result.forEach((output, index) => { 
      // index + 1 because starting index will be zero
      pdata[`p${index + 1}`] = output.value;
    })
  })

Сообщите мне, работает ли это для вас

elpmid Aug 19 2020 at 10:05

Вы можете использовать метод promises.all () для создания повторяемых обещаний, которые разрешают массив результатов, которые обещает ввод. См. Документы: Promise.all ()

Я пришел к выводу, что у вас есть множество пользователей.

const players = [player1, player2, player3];

Чтобы создать из них ввод обещания, вы можете сделать это следующим образом, используя метод array.map, который возвращает массив.

Promise.all(players.map(player => API.MWBattleData(player))).then(values => console.log(values))

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