Javascript 使用next()的执行流

Javascript 使用next()的执行流,javascript,express,routing,middleware,Javascript,Express,Routing,Middleware,我是新来表达的,对next()函数的机制有一个疑问 调用next()后,它会立即触发app.get的执行,而next()下面的所有内容都将异步执行,这对吗 如果是这样的话,为什么我在setTimeout()中设置了很大的延迟后,就不会将“我被执行了吗?”打印到控制台 请在下面的代码中解释执行流程 app.param('seriesId', (req, res, next) => { ... // Check for presence of series console.log('I

我是新来表达的,对next()函数的机制有一个疑问

  • 调用next()后,它会立即触发app.get的执行,而next()下面的所有内容都将异步执行,这对吗
  • 如果是这样的话,为什么我在setTimeout()中设置了很大的延迟后,就不会将“我被执行了吗?”打印到控制台
  • 请在下面的代码中解释执行流程

    app.param('seriesId', (req, res, next) => {
      ... // Check for presence of series
      console.log('I am executed');
      next();
      setTimeout(() => {console.log('Am I executed?')}, 1000); // Prints for 100, does not print for 1000
    });
    
    app.get('/:seriesId', (req, res, next) => {
      ... // Call to db to get series object
      res.status(200).json({series: series});
    });
    
    调用
    next()
    将处理对管道中下一个中间件的控制。在您的示例中,这将是
    app.get

    但是,该方法的行为不像
    return
    语句,因此您在后面输入的任何代码也将被执行

    根据下面的示例,如果要启动服务器并导航到,日志语句将是:

  • 我们到了
  • 执行get
  • const express=require('express');
    常量app=express();
    app.param('param',(请求、恢复、下一步)=>{
    next();
    setTimeout(()=>console.log('well-here's'),1000);
    });
    app.get('/:param',(请求,res)=>{
    设置超时(()=>{
    log('执行get');
    res.status(200.send();
    }, 2000);
    });
    app.listen(1337);
    console.log('应用程序在启动http://localhost:1337');
    
    中间件中的分支 避免混淆的一个好做法是确保在执行结束时调用
    next()
    。例如,不要这样做:

    if(条件){
    下一个()
    }
    下一步(新错误(“条件为假”);
    
    但要做到:

    if(条件){
    下一个()
    }否则{
    下一步(新错误(“条件为假”);
    }
    
    或者,我总是返回
    next()
    调用,以避免中间件执行任何进一步的代码

    在中间件中执行异步代码 最后一句话:如果您需要在中间件中执行异步代码,那么只需在该代码执行完毕后调用
    next()

    不要做:

    loadUserFromDB()
    .然后(u=>req.user=u);
    next();
    
    但要做到:

    loadUserFromDB()
    .然后(u=>{
    req.user=u;
    next();
    });
    
    一切都很清楚-thx。最后一个问题,在我的例子中-如果我在
    app.param
    中使用延迟1000的
    setTimeout()
    ,而在
    app.get
    中不使用它,为什么
    setTimeout(…,1000)
    中的语句不会打印到控制台?“如果我输入100,一切正常。”smokedsalmon用给定的代码很难分辨。一种可能的解释是执行实例在一秒钟后关闭。因此,将超时设置为100属于该限制。当您在AWS Lambda或类似的基于云的解决方案上运行代码时,可能会发生这种情况。我最好的猜测是,当我将延迟设置为1000时,另一个测试请求(post/put)会在执行
    setTimeout()
    中的回调之前运行,从而关闭上一次执行。@smokedsalmon这是一个合理的解释是的,下一次测试运行时会终止上一次执行。