我正在使用标准的“请求”模块
https://www.npmjs.org/package/request
我想知道 - 如果我有两个连续/顺序请求调用,那么:
request.post({...});` //first request
request.get({...});` //second request
...如何进行同步,以便第一个请求在第二个请求被调用之前总是完成(第一个请求是身份验证,所以肯定需要先发生)。
我知道如何做到这一点的唯一方法是将它们嵌套起来:
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)
}
})
});
还有另一种方法吗?
一种方法是使用节点约定来传递回调函数“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: "the1mills@yahoo.com",
password: "*******"
}
}, function (err, res, body) {
if (err) {
throw err;
}
teamSnapToken = res.headers['x-teamsnap-token'];
makeGetRequest();
})};
authPost(makeGetRequest);
虽然我不得不说,这似乎只是使用函数作为对象的一个愚蠢的借口,因为两个函数都在同一个文件中,所以你可以通过名称调用另一个函数而不将它嵌套或传入as一个参数,whatevs。
答案 0 :(得分:2)
几乎就是这样 - 你知道请求已经完成就是回调触发了,所以如果你在第一个请求完成后必须发生一些事情,你必须在回调中进行。
有一些方法可以让这看起来更容易,但它基本上仍然是一样的。例如,使用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
});