(如果有区别,我正在使用Restify而不是Express。)
每次碰到端点都会按预期工作:
server.post('/myendpoint', (req, res, next) => {
setTimeout(() => {
console.log('done');
res.send();
return next();
}, 3000);
});
这仅在第一次命中端点时起作用,然后在再次命中端点时立即返回而不运行promise(未看到console.log):
// myPromise.js
module.exports = new Promise((resolve, reject) => {
// doesn't run when the endpoint is hit a 2nd time
setTimeout(() => {
console.log('done');
resolve();
}, 3000);
});
server.post('/myendpoint', async (req, res, next) => {
const myPromise = require('./myPromise');
await myPromise;
res.send();
return next();
});
我想这段代码几乎是一样的。我想念什么吗?
答案 0 :(得分:2)
模块由require()
缓存。因此,第一次加载模块时,模块代码将运行。之后,module.exports
值已被缓存,并且先前的结果将立即返回。您的模块初始化代码将不会再次运行。因此,第二次加载模块时,第一次创建的承诺将立即返回。
如果您希望每次都运行一些代码,则应该导出一个函数,然后可以在每次运行时调用该函数。
// myPromise.js
// export a function
module.exports = function() {
return new Promise((resolve, reject) => {
// doesn't run when the endpoint is hit a 2nd time
setTimeout(() => {
console.log('done');
resolve();
}, 3000);
});
}
server.post('/myendpoint', async (req, res, next) => {
// note we are calling the exported function here
const myPromise = require('./myPromise')();
await myPromise;
res.send();
return next();
});