嵌套请求正在阻止

Tho*_*ggi 4 javascript asynchronous nonblocking node.js

我对nodejs比较陌生.我最近把我过去几个月收集的所有集体知识汇集到了一个项目中.我相信我遇到了nodejs中的第一个"阻塞"问题.

我有一个页面加载两个request()调用,他们是异步和相应的嵌套.最里面的一个使用来自最里面的数据来重定向用户.

  request(parameters,function(error, response, data){
      //the first request passes a token  
      request(newParamters,function(error, response, data){
          //the second request passes a url
          res.redirect(data.info.url);
      });
  });
Run Code Online (Sandbox Code Playgroud)

错误是当我在许多浏览器选项卡中打开它时,它会在第一对之后断开,然后服务器说data.info.url是未定义的.

我的问题是:我一次只能执行一个请求吗?我可以保存第一个令牌request()并将用户重定向到第二个request()这会有帮助吗?我一直非常注重异步和不阻塞,我很震惊这种情况正在发生.任何反馈都会很棒!

sae*_*eed 6

像这样嵌套会导致许多问题.

我更喜欢这种模式,我将所有内容分解为更容易阅读的命名函数.

当一个函数完成时,它会调用next,依此类推.

parameters = {};   //define parameters
first(parameters); // call first function to kick things off.

var first = function(parameters) {

      request(parameters,function(error, response, data){
         newParamters = date.something;        
         second(newParamters, data); //call second function         
     });
};

var second = function(newParamters, data){

      request(newParamters,function(error, response, data){
          res.redirect(data.info.url);
     });
}
Run Code Online (Sandbox Code Playgroud)

这种模式是"非阻塞的",因此当第一个请求发出时,nodejs进程退出并在接收到响应时继续,然后第二个函数将被调用.

当第二个请求发出时,nodejs进程再次退出.重定向仅在收到响应后发生.

  • 这个答案严重影响了我使用异步和回调的新代码.直到现在我才意识到这一点.在使用JavaScript和node.js时,这非常重要,非常感谢. (2认同)