在TypeScript中等待Foreach给出错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在TypeScript中等待Foreach给出错误相关的知识,希望对你有一定的参考价值。

我在Express JS中进行了JS开发,我们正在将应用程序迁移到TypeOrm的Typescript。

async function loadRootMessagesForTwitter(req, res) 
{
 const messageRepository = getManager().getRepository(Message);
 req.body.forEach(function(obj) {
  const requestMessage = messageRepository.create(obj);
    var channel_message_ID = requestMessage['channel_message_ID'];
    if (channel_message_ID) {                      
           await messageRepository.save(requestMessage);
        }
     }

我面临以下错误

error TS1308: 'await' expression is only allowed within an async function
答案

传递给forEach的函数必须是async

req.body.forEach(async function(obj) {
  // ...
  await messageRepository.save(requestMessage);
});
另一答案

为什么不这样做?

async function loadRootMessagesForTwitter(req, res) {
 const messageRepository = getManager().getRepository(Message);
 const arr = req.body;
 for(let i=0;i<arr.length;i++) {
  let obj = arr[i]
  const requestMessage = messageRepository.create(obj);
  let channel_message_ID = requestMessage['channel_message_ID'];
  if (channel_message_ID) {                      
    await messageRepository.save(requestMessage);
  }
 }
}
另一答案

如果你想确保在进行循环的下一次迭代之前等待每个forEach调用完成,那么简单地使用带有异步回调的save()就不起作用了。在这种情况下,这可能无关紧要,因为你忽略了save()调用的任何结果,也许你可以抛出一堆对save()的调用,在这种情况下简单地说:

 const messageRepository = getManager().getRepository(Message);
 req.body.forEach(function(obj) {
  const requestMessage = messageRepository.create(obj);
    var channel_message_ID = requestMessage['channel_message_ID'];
    if (channel_message_ID) {                      
           messageRepository.save(requestMessage);
        }
     }

但是,如果你想控制调用,那么只需停止使用forEach并使用typescript的for...of代替:

 const messageRepository = getManager().getRepository(Message);
 for (let obj of req.body) {
  const requestMessage = messageRepository.create(obj);
    var channel_message_ID = requestMessage['channel_message_ID'];
    if (channel_message_ID) {                      
           await messageRepository.save(requestMessage);
    }
  }
 }

以上是关于在TypeScript中等待Foreach给出错误的主要内容,如果未能解决你的问题,请参考以下文章

VS Code Typescript 在 Vuejs 项目中给出错误“属性不存在”

Parallel.Foreach 给出错误“索引超出了数组的范围”

带有 react-dnd 的 TypeScript 2.0 给出错误“JSX 元素属性可能不是联合类型”

当我从等待移动到 Promise.all 时,TypeScript 函数返回类型错误

如何在 TypeScript 中打破 ForEach 循环

Axios 和 Typescript 给出一个类型的 promise 拒绝错误