2012-08-24 118 views
3

我对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); 
     }); 
    }); 

的错误是,当我在很多浏览器标签页打开这个了它最终打破了第一对夫妇则表示服务器后data.info.url是不确定的。

我对你的问题是:我是否应该一次只执行一个请求?我可以从第一个request()保存令牌并将用户重定向到第二个request()这会有帮助吗?我一直非常关心异步,而不是阻塞,我很震惊,这是发生。任何反馈都会很棒!

+1

'parameters'后面真的有一个右括号吗? – Joseph

+0

不,不存在 – ThomasReggi

+0

这个'newParameters'从哪里来?它是从以前的请求?你可以发布更简洁的代码吗? – Joseph

回答

4

像这样嵌套会导致很多问题。

我更喜欢这种模式,我把所有东西都分解成更易于阅读的命名函数。

当一个函数完成时,它调用下一个等等。

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); 
    }); 
} 

这种模式是“非阻塞的”,所以当第一请求是由该过程的NodeJS出口和被接收时的响应才将第二函数被调用继续。

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

+2

这个答案严重影响了我用异步和回调编码的新风格。直到现在我才意识到这一点。在使用JavaScript和node.js时,这非常重要,谢谢。 – ThomasReggi