首页 > 解决方案 > nodejs(Web Api)中的异步和等待

问题描述

我试图在我的循环中使用promise,但循环不会等待,而是打印一个上面声明的空数组值。这是我的代码:

节点:

let total_json = [];
     await Promise.all(results.map(async (element) => {
                if (element.start_date <= d && element.end_date >= d) {
                  let query = "select * from tb_voucher_category where id = " + "'" + element.cateID + "'";
                  body.query = query;
                  COMMON(body, (err, results) => {
                    if (err) { fatal_error.data = err; return res.json(fatal_error); }
                    if (results) {
                      if (results.length > 0) {
                        cate = results[0].cateName;
                      } else {
                        cate = "";
                      }
                      let json = {
                        id: element.id,
                        catename: cate,
                        title: element.title,
                        description: element.description,
                        expired_date: element.expired_date,
                        expired_time: element.expired_time,
                        vStatus: element.vStatus

                      }
                     total_json.push(json);
                    }
                  });
                }
              }));

    ///i need the json printed here but it becomes null. how can i use async or promise here?
    console.log(total_json)

我见过很多堆栈问题,我只是无法在我的代码中实现它。

标签: javascriptnode.jsarraysjsonexpress

解决方案


假设您使用的是 Express.js(从 推断res.json()),我建议将数据库调用与响应隔离开来。

function resultsToJSON(results) {
  if (results.length > 0) {
    cate = results[0].cateName;
  } else {
    cate = "";
  }
  let json = {
    id: element.id,
    catename: cate,
    title: element.title,
    description: element.description
  };
  return json;
}


// returns a single promise that resolves to a list of json results,
// or rejects as an error.
function getData() {

// `promises` is a list of Promises that either resolve to the database result,
// or rejects due to a database error.
const promises = results
  .filter(element => element.start_date <= d && element.end_date >= d)
  .map(element => {
    let query = "select * from tb_voucher_category where id = " + "'" + element.cateID + "'";
    body.query = query;
    return new Promise((resolve, reject) => {
       COMMON(body, (err, results) => {
         if (err) { reject(err); }
         else { resolve(results); }
       });
    });
  });

return Promise.all(promises);

}

然后,在您的 Express 请求处理程序中,您可以处理错误(并发送错误响应),或者total_jsons从解析 Promise 中获取数组。


// mark function as `async` if you are going to use `await` in the body.
app.get("/yourAPI", async (req, res) => {

  // given that `getData()` returns a promise that resolves to a list of results,
  // `await getData()` waits for the promise to be resolved, and returns the list of results.
  try {
    const total_json = await getData();
  } catch (error) {
    // handle a failure in *any* of your database requests
    fatal_error.data = error;
    res.json(fatal_error);
  }
});

推荐阅读