同步请求节点

问题描述:

要求我使用的是标准的“请求”模块同步请求节点

https://www.npmjs.org/package/request

我wondering-如果我有两个连续/顺序请求调用,像这样:

request.post({...});` //first request 

request.get({...});` //second request 

。 ..如何做同步,以便第一个请求在第二个请求被调用之前总是完成(第一个请求是身份验证,因此肯定需要首先发生)。

我知道如何做到这一点的唯一方法是窝他们​​是这样的:

request.post({ 
    url: teamsnapURL, 
    json: { 
     user: "[email protected]", 
     password: "******" 
    } 
}, function (err, res, body) { 
    if (err) { 
     throw err; 
    } 
    teamSnapToken = res.headers['x-teamsnap-token']; 

    request.get({ 
     url: 'https://api.teamsnap.com/v2/teams', 
     json: { 
     }, 
     headers: { 
      'x-teamsnap-token':teamSnapToken 
     } 
    }, function (err, res, body) { 
     if (err) { 
      throw err; 
     } 
     else{ 
      console.log('body:',body) 
     } 

}) 
}); 

有另一种方式?

一种方法是使用节点约定传递回调函数“next”,并调用如果验证有效,否则抛出错误。我会看看我是否可以解决这个问题并将其添加为答案(这个问题不仅仅只有一个答案)。

这里是非嵌套的回调方式,通过传递函数作为参数解决。这似乎是避免大量嵌套函数调用的相当标准。

var request = require('request'); 
var teamsnapURL = 'https://api.teamsnap.com/v2/authentication/login'; 

var teamSnapToken = null; 

var makeGetRequest = function(){ 

    request.get({ 
     url: 'https://api.teamsnap.com/v2/teams', 
     json: { 

     }, 
     headers: { 
      'x-teamsnap-token':teamSnapToken 
     } 
    }, function (err, res, body) { 
     if (err) { 
      throw err; 
     } 
     else{ 
      console.log('body:',body) 
     } 

    }); 

}; 

var authPost = function(makeGetRequest){ 

    request.post({ 
     url: teamsnapURL, 
     json: { 

      user: "[email protected]", 
      password: "*******" 
     } 
    }, function (err, res, body) { 
     if (err) { 
      throw err; 
     } 
     teamSnapToken = res.headers['x-teamsnap-token']; 
     makeGetRequest(); 

})}; 

authPost(makeGetRequest); 

但我不得不说,这似乎只是一个愚蠢的借口,使用功能为对象,因为这两个功能都在同一个文件,所以你可以只叫名字的其他功能,而无需其嵌套或作为参数传入,whatevs。

+1

我想这也是可能的承诺,但我不知道有足够的了解承诺写一个很好的答案。 – 2014-12-05 06:32:27

+1

如果您有兴趣,我会谈谈JS中各种异步编程风格,涵盖了很多选项。视频在这里:http://channel9.msdn.com/Events/Patterns-Practices-Symposium-Online/pattern-practices-symposium-2013/Embracing-Async-Programming – 2014-12-05 22:47:09

就是这样 - 你知道一个请求已经完成了,就是回调触发了,所以如果你在第一个请求完成后必须发生什么,你必须在回调中完成。

有办法让这看起来更容易,但它仍然是基本相同的事情。例如,使用async库,像这样:

async.waterfall([ 
    function (done) { 
     request.post(firstRequest, function (err, res, body) { done(err, res, body); }); 
    }, 
    function (done, res, body) { 
     teamSnapToken = res.headers[...]; 
     request.get(second-request, function (err, res, body) { done(err, res, body); }); 
    } 
    ], 
    function (err, result) { 
     // final callback here 
    }); 
+0

必须有一种方法来同步,在Java中将使用对象的监视器,使用同步关键字和wait()和notify()/ notifyAll()方法 – 2014-12-05 08:03:21

+0

这是什么:http://alexeypetrushin.github.io/synchronize/docs/index.html – 2014-12-05 08:23:55

+1

整洁!我以前没见过那个。然而,在引擎盖下它所做的就是所谓的“延续传球风格变形” - 基本上是做回​​调的东西,并重写代码使它看起来像一个直接的同步流。另一个例子是https://github.com/Sage/streamlinejs。 Java监控工作是因为它是多线程的,可以阻塞线程。 Javascript是单线程的,阻止唯一线程等待某些东西是不行的。 – 2014-12-05 19:34:11