簡體   English   中英

等待 Promise 在 express 函數中完成

[英]Wait a Promise to finish in an express function

我在 Express 中有一個需要驗證的 post 調用,所以我創建了一個名為“validator.js”的 javascript 文件來在繼續之前檢查傳遞的值。 “validator.js”中的方法之一需要進行axios調用,但在填充數據之前顯然需要時間。 所以我像這樣用 async/await 解決了

router.post("/add_to_favorites", passport.authenticate("local"), async(req, res) => 
    { let validation = await validateMedia(req.body);

if (validation.error) {
    return res.status(400).json(validation.message);
   }

“validateMedia”是調用validator.js 的函數。


考慮到以下代碼,處理此 axios 異步調用的最佳方法是什么?

表達

router.post("/add_to_favorites", passport.authenticate("local"), (req, res) => { let validation = validateMedia(req.body); if (validation.error) { return res.status(400).json(validation.message); } }

驗證器.js

 const validateMedia = data => { if (data.mediaType !== "movie" && data.mediaType !== "serie") { return { error: true, message: "Media type is not valid" }; } if (data.mediaType === "movie") { axios.get(`/${data.mediaType}/${data.mediaId}`).then(response => { if (data.mediaTitle === response.data.title) { return { error: false, message: "Success" }; } return { error: true, message: "Failed" }; }); } return { error: false, message: "Checked values" }; }

您分享的信息有限。 需要如何定義validateMedia是使用new Promise返回new Promise還是async函數? async-await await等待承諾得到解決。

在此處閱讀有關async-awaitpromise 的更多信息。

根據您提供的信息,如果validateMedia函數類似於:

承諾:

function validateMedia(data) {
  // Using promise here
  return new Promise ( (resolve, reject) => {
    if (data.mediaType !== "movie" && data.mediaType !== "serie") {
      return resolve({    // Call resolve function to return success
        error: true,
        message: "Media type is not valid"
      });
    }

    if (data.mediaType === "movie") {
      // This is the function needs to wait for.
      axios.get(`/${data.mediaType}/${data.mediaId}`).then(response => {
        if (data.mediaTitle === response.data.title) {
          // Call resolve function to return success
          return resolve({ error: false, message: "Success" });
        }
        // Call reject function to return error
        return reject({ error: true, message: "Failed" });
      });
    }
  });
}

使用異步等待:

async function validateMedia(data) {

  if (data.mediaType !== "movie" && data.mediaType !== "serie") {
      return {
        error: true,
        message: "Media type is not valid"
      };
  }

  if (data.mediaType === "movie") {
      try {
          // This is the function needs to wait for. if axios.get() returns a promise
          let response = await axios.get(`/${data.mediaType}/${data.mediaId}`);

          if (data.mediaTitle === response.data.title) {
              return { error: false, message: "Success" };
          }
          return { error: true, message: "Failed" };
      }
      // If axios.get() throws error or rejects promise
      catch (err) {
          return { error: true, message: "Failed" };
      }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM