同步Node中的请求调用

我正在使用标准的“请求”模块

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

我想知道,如果我有两个连续的/连续的请求调用如下所示:

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

…我怎么做同步,以便第一个请求总是完成之前,第二个被调用(第一个请求是身份validation,所以肯定需要首先发生)。

我知道如何做到这一点的唯一方法就是像这样嵌套它们:

  request.post({ url: teamsnapURL, json: { user: "the1mills@yahoo.com", 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) } }) }); 

有另一种方法吗?

一种方法是使用节点约定传递callback函数“next”,并调用authentication工作,否则抛出错误。 我会看看如果我能弄清楚,并添加作为答案(这个问题不只有一个答案)。

这里是非嵌套的callback方式,以传递函数作为参数解决。 这似乎是非常标准的,以避免沉重的嵌套函数调用。

 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: "the1mills@yahoo.com", password: "*******" } }, function (err, res, body) { if (err) { throw err; } teamSnapToken = res.headers['x-teamsnap-token']; makeGetRequest(); })}; authPost(makeGetRequest); 

虽然我不得不说,这似乎只是一个愚蠢的借口使用函数作为对象,因为这两个函数都在同一个文件中,所以你可以通过名称调用另一个函数,而不用嵌套或作为参数传入, whatevs。

这就好了 – 你知道一个请求已经完成了,就是这个callback触发了,所以如果你在第一个请求完成之后必须发生一些事情,你必须在callback中完成。

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

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