NodeJS - 需要帮助理解并将同步相关的MySQL查询代码转换为可用的东西

时间:2018-05-15 11:03:28

标签: javascript mysql node.js

这是我的第二个Node项目。我正在使用Node,Express,MySQL。

我正在做的是,我有一些已发布内容的用户名称,然后我遍历这些名称,并为每个人做一个connection.query来获取他们的帖子并将它们存储到一个数组中(之后我对它进行了一些其他的数据处理,但那不是重要的部分)

问题是:我的代码在从connection.query接收数据之前尝试进行数据操作!

我google-d并且似乎异步等待是我需要的东西,问题是,我无法在我的代码中正确地适应它。

             // namesOfPeopleImFollowing is the array with the names
             namesOfPeopleImFollowing.forEach(function(ele){



             connection.query(`SELECT * FROM user${ele}posts`, function(error,resultOfThis){
              if(error){
                console.log("Error found" + error)
              } else {                        
                allPostsWithUsername.push([{username:ele},resultOfThis])                                              
              }
            })                 
          })

          console.log(JSON.stringify(allPostsWithUsername)) // This is EMPTY, it mustn't be empty.

那么,我该如何将其转换为可以正常工作的东西呢?

(包括你需要整个代码,这里是:https://pastebin.com/dDEJbPfP虽然我忘了取消注释代码)

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

有很多方法可以解决这个问题。一个简单的方法是将函数包装在promise中,并在回调完成时解析。

const allPromises = [];
namesOfPeopleImFollowing.forEach((ele) => {
  const myPromise = new Promise((resolve, reject) => {
    connection.query(`SELECT * FROM user${ele}posts`, (error, resultOfThis) => {
      if (error) {
        reject(error);
        console.log(`Error found${error}`);
      } else {
        resolve({ username: ele });
      }
    });
  });
  allPromises.push(myPromise);
});

Promise.all(allPromises).then((result) => {
  // your code here
})

您可以阅读有关promise.all here

的更多信息