【问题标题】:Express app.use does not send correct fake dataExpress app.use 未发送正确的虚假数据
【发布时间】:2018-07-11 04:57:40
【问题描述】:

我在练习 Express 4.x 并注意到以下几点:

app.get('/fake', function(req, res) {
  var obj = [];
  for (let i = 0; i < 3; i++) {
    jsf.resolve(fakeSchema).then(function(iter) {
      obj.push(iter);
    });
  }
  res.send(obj);
});

所以,走这条路,我得到了"[ ]",而我期待收到一组 3 个(假)文档。

仅供参考,在记录每个循环时,我可以清楚地看到生成的文档,甚至在数组内部。

有什么解释吗?

【问题讨论】:

标签: javascript express callback routes faker


【解决方案1】:

您的 jsf.resolve 函数是异步的,因此您可以使用 async/await 以同步方式执行任务。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

 app.get('/fake', async function(req, res) {
        var obj = [];
        for (let i = 0; i < 3; i++) {
            try {
                var iter = await jsf.resolve(fakeSchema);
                obj.push(iter);
            } catch (e) {}
        }
        res.send(obj);
    });

【讨论】:

    【解决方案2】:

    虽然@Nishant 提供的答案有效,但我建议使用这种方法。

    let jsf = {};
    // faking your jsf.resolve method
    jsf.resolve = (param) => {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve(Math.random());
        }, 1000);
      })
    };
    let fakeSchema = {};
    let obj = [];
    let promises = [];
    for (let i = 0; i !== 3; i++) {
      promises.push(jsf.resolve(fakeSchema).then(function (iter) {
        obj.push(iter);
      }));
    }
    Promise.all(promises).then(() => {
      console.log(obj);
    });

    这允许所有的承诺同时运行,想象你的jsx.resolve 需要很长时间才能完成,使用await 会冻结你的整个应用程序。

    与此相反。注意运行时。

    (async () => {
      let jsf = {};
      // faking your jsf.resolve method
      jsf.resolve = (param) => {
        return new Promise((resolve) => {
          setTimeout(() => {
            resolve(Math.random());
          }, 1000);
        })
      };
      let fakeSchema = {};
      let obj = [];
      for (let i = 0; i !== 3; i++) {
        obj.push(await jsf.resolve(fakeSchema));
      }
      console.log(obj);
    })();

    【讨论】:

      【解决方案3】:

      @Nishant Dixit 的回答也正确! 如果您愿意,也可以尝试这个简单的解决方案:

      app.get('/fake', function(req, res) {
        var obj = [];
        for (let i = 0; i < 3; i++) {
          try {
              jsf.resolve(fakeSchema).then(function(iter) {
                 obj.push(iter);
                 res.send(obj);
          } catch (e) {
              res.send(e);
          }
          });
        };
      });
      

      【讨论】:

      • 在这个实现中,服务器每次迭代都可以发送obj吗?
      猜你喜欢
      • 2022-10-07
      • 2013-04-26
      • 1970-01-01
      • 2018-05-14
      • 2016-10-25
      • 1970-01-01
      • 2012-02-11
      • 2017-08-10
      • 1970-01-01
      相关资源
      最近更新 更多