代码之家  ›  专栏  ›  技术社区  ›  atkayla

服务器终结点只在第一次调用时运行promise函数,然后立即返回

  •  1
  • atkayla  · 技术社区  · 6 年前

    (如果有区别的话,我使用的是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();
    });
    

    我可以想象这个代码几乎是相同的。我错过什么了吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   jfriend00    6 年前

    模块被缓存 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();
    });