【问题标题】:code is not waiting for forEach to complete : Async代码不等待 forEach 完成:异步
【发布时间】:2018-11-19 22:03:43
【问题描述】:

我有一个函数

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 完成

【问题讨论】:

  • 您向我们展示的代码中没有任何内容可以解释您所看到的行为。也许const val = await transformAllUserAndSubscription (userList) 不在异步函数中。您需要提供minimal reproducible example
  • @jhc — 它循环在userList 而不是userListArray,我们看不出它有什么价值。
  • @BhojendraRauniyar — 您只能等待承诺。异步函数总是返回承诺。这么多就好了。
  • 我相信我之前已经看到了这个问题的答案 - 这与 forEach 将每次迭代视为一个单独的方法有关,而不必像下面那样执行一组顺序指令,比如说,一个带有起始索引和结束索引的传统 for 循环。仍在尝试找到我阅读此信息的确切位置并将发布链接。
  • @AJC24 — 这取决于循环内正在做什么。 OP 需要提供minimal reproducible example

标签: javascript node.js promise async-await


【解决方案1】:

这是您可以使用的解决方案。

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

【讨论】:

    【解决方案2】:

    您不必为此使用 async await。如果你的 for 循环中的代码不会进行任何异步操作,你就不需要使用asyncawait

    像这样简单的东西应该适合你。

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

    如果你还想使用asyncawait,那么你需要正确使用它。 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);
    });

    【讨论】:

      【解决方案3】:
      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);
         }
      })
         });
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        • 2015-07-01
        • 2013-09-16
        • 2021-11-13
        相关资源
        最近更新 更多