javascript - 代码始终在响应发送到浏览器后执行

标签 javascript node.js asynchronous promise async-await

这是我遇到的问题,如果我没有在 asyncCall 函数中设置超时,则在异步代码完成之前发送响应,因此我无法从 onlineBooksImages() 函数,但在下面的代码中包含超时

  setTimeout(() => {


    if (onlineBook) {

        res.status(200).render("showBooks",
            {
                result: result,
                favourites: favourites,
                user: user,
                book: onlineBook

            });
    } 



}, 5000);

延迟发送响应,因此我得到了图像,如何编写以下代码以消除超时,该超时比使用异步代码更快的加载时间更长

var boos = []
var boos2 = []
var boos3 = []
var foo = {}
var foo2 = {}
var foo3 = {}

const onlineBook= await Books2.findById(req.params.id);
const Ebook = await Ebooks.findById(req.params.id);

 function onlineBooksImages() {
    return new Promise(resolve => {
        setTimeout(() => {

            let temporaryVar = []
            onlineBook.allimages.forEach(element => {
                gfs.files.findOne({ _id: element }, (err, file) => {
                    if (!file || file.length === 0) {
                        return res.status(404).json({
                            err: "No file exist"
                        });
                    }
                    var u = []
                    u.push(onlineBook._id)
                    var img = []
                    img.push(file)
                    user.push(file)
                    foo3[u] = temporaryVar;
                    //console.log(user.length);
                });
            });
            boos3.push(foo3)

            resolve(boos3);
        }, 100);
    });
} 
  async function asyncCall() {
    console.log('calling');
    if (onlineBook) {
        var result = await onlineBooksImages();
    } else if (Ebook) {
        var result2 = await someOtherFunction();//notImportant

    } else {
        return res.status(404).render('error', { user });
    }
    setTimeout(() => {


        if (onlineBook) {

            res.status(200).render("showBooks",
                {
                    result: result,
                    favourites: favourites,
                    user: user,
                    book: onlineBook

                });
        } 



    }, 5000);

}

最佳答案

在回答之前......这里有一些有趣的代码

  this code looks wrong on many levels

  var u = [];
  u.push(onlineBook._id);
  // snip
  foo3[u] = temporaryVar;

现在,我们说 onlineBook._id === "abc"

因此u === ['abc']

所以 foo3[u]foo3[u.toString()] 相同...这将是 foo3['abc']

那么为什么不只是foo3[onlineBook._id] = temporVar;

但即使这样看起来也很奇怪,因为 foo3 中的每个属性都将引用同一个数组

例如如果图书 ID 为“abc”、“def”和“ghi”,则 foo3.abcfoo3.deffoo3.ghi 将是完全相同的空数组!

无论如何,给出一个答案,虽然我仍然对你的“全局”boos* 和 foo* 变量感到困惑 - 但让我们解决你遇到的问题:

function async onlineBooksImages() {
  let temporaryVar = [];
  for (let element of onlineBook.allimages) {
    try {
      const file = await new Promise((resolve, reject) => {
        gfs.files.findOne({_id: element}, (err, file) => {
            if (err) {
                return reject(err);
            }
            temporaryVar.push(file);
            resolve(file);
        })
      });
      if (!file || file.length === 0) {
        return reject();
      }
      foo3[onlineBook._id] = temporaryVar;

    } catch(e) {
        // do nothing but catch the error
    }
  }
  if (Object.keys(foo3).length) {
    boos3.push(foo3);
    return boos3;
  } else {
    // reject if there were no images in any of allimages
    throw({status: 400, err: "No file exist"});
  }
}

async function asyncCall() {
  console.log('calling');
  try {
    if (onlineBook) {
      var result = await onlineBooksImages();
    } else if (Ebook) {
      var result2 = await someOtherFunction();//notImportant
    } else {
      return res.status(404).render('error', { user });
    }
    if (onlineBook) {
      res.status(200).render("showBooks", {
        result: result,
        favourites: favourites,
        user: user,
        book: onlineBook
      });
    } 
  } catch(e) {
      if (e.status && e.err) {
        res.status(e.status).json({
          err: e.err
        });
      }
  }
}

关于javascript - 代码始终在响应发送到浏览器后执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58906314/

相关文章:

javascript - 包含 PHP 页面并在单击链接时替换 div

javascript - 试图让图像以 HTML 形式发出警报

javascript - 如何在 Node.js 控制台中发现对象 API?

javascript - 运行 JavaScript 代码 SublimeText

javascript - 有什么方法可以使用 qunit 测试异步 jquery 插件,避免嵌入 "start()"并保持异步?

javascript - Javascript 中的递归函数返回未定义

javascript - HackerRank 中的生日蛋糕蜡烛(简单的 for 循环问题)

node.js - 在 sequelize updateattributes 方法中只能更新表中的一个属性吗?

Python 异步和 CPU 密集型任务?

java - 异步任务上的多个notifyObservers()不起作用