Express app.use无法发送正确的假数据

时间:2018-07-11 04:57:40

标签: javascript express callback routes faker

我正在练习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个(假)文件的阵列。

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

有什么解释吗?

3 个答案:

答案 0 :(得分: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);
    });

答案 1 :(得分:1)

尽管@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会冻结整个appp。

与此相反。注意运行时。

(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);
})();

答案 2 :(得分:0)

@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);
    }
    });
  };
});