我正在练习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个(假)文件的阵列。
仅供参考,当记录每个循环时,即使在数组内部,我也可以清楚地看到生成的文档。
有什么解释吗?
答案 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);
}
});
};
});