код не ждет завершения forEach: Async - PullRequest
0 голосов
/ 19 ноября 2018

у меня есть функция

transformAllUser = async (userList): Promise<any> => {
  return new Promise((resolve, reject) => {
        const userListArray = [];
        userList.forEach((user) => { 
             // do something like or something else
            userListArray.push({obj : user})
        })
     resolve(userListArray )
 })
}

и получить это значение:

const val = await transformAllUser(userList);
console.log(val) // its empty.

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

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018
Use async node module.

let async = require('async');

function transformAllUser(){
   return new Promise((resolve, reject) => {
      async.eachOfSeries(userList, (user, callback)=>{
      // do something like or something else
      callback(null, {obj : user});
}, (err, results)=>{
   if(err){
      // Handle error
      reject(err);
   } else {
      resolve(results);
   }
})
   });
}
0 голосов
/ 19 ноября 2018

Вот решение, которое вы можете использовать.

const transformAllUser = async (userList) => userList.map(user => ({obj: user}))
const users = [{name : "1"}, {name : "2"}, {name : "3"}]

(async () => {
  const transformedUsers = await transformAllUser(users)
  console.log(transformedUsers)
})()
0 голосов
/ 19 ноября 2018

Вам не нужно использовать async await для этого.Если код внутри вашего цикла for не собирается выполнять какую-либо асинхронную операцию, вам не нужно использовать async await.

Что-то простое, подобное этому, должно работать для вас.

const transformAllUser = (userList) => {
  const userListArray = [];
  userList.forEach((user) => {
    userListArray.push({
      obj: user
    })
  })
  return userListArray;
}

const userList = [{name: 'john'}, {name: 'doe'}];
const val = transformAllUser(userList);
console.log(val);

Если вы все еще хотите использовать async await, то вам нужно использовать его правильно.await может существовать только внутри функции async.

const transformAllUser = async (userList) => {
  return new Promise((resolve, reject) => {
    const userListArray = [];
    userList.forEach((user) => {
      userListArray.push({ obj: user })
      // if you have any asyncronous actions here, say, API call or promise, you will await it
      // await makeAsyncCall()
    })
    resolve(userListArray);
  })

}

const userList = [{
  name: 'john'
}, {
  name: 'doe'
}];

transformAllUser(userList).then(val => {
  console.log(val);
});
...