同步请求节点
要求我使用的是标准的“请求”模块同步请求节点
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。
就是这样 - 你知道一个请求已经完成了,就是回调触发了,所以如果你在第一个请求完成后必须发生什么,你必须在回调中完成。
有办法让这看起来更容易,但它仍然是基本相同的事情。例如,使用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
});
必须有一种方法来同步,在Java中将使用对象的监视器,使用同步关键字和wait()和notify()/ notifyAll()方法 – 2014-12-05 08:03:21
这是什么:http://alexeypetrushin.github.io/synchronize/docs/index.html – 2014-12-05 08:23:55
整洁!我以前没见过那个。然而,在引擎盖下它所做的就是所谓的“延续传球风格变形” - 基本上是做回调的东西,并重写代码使它看起来像一个直接的同步流。另一个例子是https://github.com/Sage/streamlinejs。 Java监控工作是因为它是多线程的,可以阻塞线程。 Javascript是单线程的,阻止唯一线程等待某些东西是不行的。 – 2014-12-05 19:34:11
我想这也是可能的承诺,但我不知道有足够的了解承诺写一个很好的答案。 – 2014-12-05 06:32:27
如果您有兴趣,我会谈谈JS中各种异步编程风格,涵盖了很多选项。视频在这里:http://channel9.msdn.com/Events/Patterns-Practices-Symposium-Online/pattern-practices-symposium-2013/Embracing-Async-Programming – 2014-12-05 22:47:09