首页 > 解决方案 > 在 node.js 中以正确的顺序运行代码

问题描述

我正在制作一个根据用户兴趣编译文章的网站。而且我有一个后端,但我无法让代码以正确的顺序运行,基本上我有一个包含用户的 MongoDB 数据库,每个用户都有一封电子邮件和一系列兴趣。代码首先遍历用户,然后遍历兴趣并添加一定数量的文章来为每个兴趣推荐。但是我需要在循环完所有兴趣后将这些数据返回给客户端,但我找不到这样做的方法。代码:

  //? Get user emails and intrests
  UsersReference.find({}).toArray(function (err, users) {
    for (var i = 0; i < users.length; i++) {
      const user = users[i]
      //? Generate a text blurb for user based off there intresets
      var limit = 10 / user.intrests.length
      for (var j = 0;j < user.intrests.length;j++) {
        axios({
          "method": "POST",
          "url": "https://tidalwaves-news-analytics2.p.rapidapi.com/articles?limit=" + limit,
          "headers": {
            "x-rapidapi-host": "tidalwaves-news-analytics2.p.rapidapi.com",
            "x-rapidapi-key": "SECRET",
            "useQueryString": true
          },
          "data": {
            "url": {
              "query": user.intrests[j]
            },
          }
        }).then((res) => {
          for(var l =0;l < res.data.data.length;l++) {
            blurbs[i] = blurbs[i] + ". " + res.data.data[l].title
          }
        }).catch((err) => {
          console.log(err)
        })
      }
}

标签: javascriptnode.jsmongodbexpresspromise

解决方案


您可以将逻辑包装在函数中并使用关键字,而不是使用then()等待承诺履行。asyncawait

这将使您的代码更易于阅读,并且可以解决您的问题。

例子:

async function myFunction() {
  for (const item of items) {
    const result = await axios({...});
    // Do something with `result`....
  }
}

推荐阅读