Nodejs 请求后跟请求 - 同步问题
Nodejs Request followed by Request - synchronization issue
我是回调地狱世界的新手,有点卡住了。我正在做一些分析工作,所以每次调用一个函数时,我都会调用一个执行 request.post 的函数来记录我们服务器上的请求。然而,在这些原始函数中的每一个中,request.get 都对 return 一些信息进行了处理。因此,我实质上是在调用一个函数,该函数在另一个需要在该函数之后发出请求的函数中发出请求。代码本身比我刚才描述的要复杂得多(而且复杂,我的意思是又长又烦人),所以这里是简化版:
function myFunction(x, y, callback) {
// variable declarations
postFunction(a, b);
// other logic for the function
request.get(url, function(error, response, body) {
// request code here
callback(somedata, otherFunctionThatDoesntMatterHere(blah));
});
}
function postFunction(a, b) {
// other logic for the function
var dataToSend = "XML HERE";
request.post({
url: url,
body: dataToSend,
headers: {'Content-Type' : 'text/xml'},
function(error, response, body) {
if (error) {
console.log(error);
}
else if (response.statusCode !== 200) {
console.log('Invalid Status Code Returned:', response.statusCode);
}
else if (!error && response.statusCode == 200) {
console.log('POST RESPONSE: ', body);
}
}
);
}
现在发生的事情是 post 函数不会在主函数结束之前 return。我知道这是节点异步性的一部分,但我希望这些同步执行。我很确定我可以通过向 post 函数添加回调来解决这个问题,但我不确定如何解决。我尝试了很多不同的方法,但恐怕我并不完全理解这一切是如何工作的。预先感谢您提供的任何帮助!
如果您真的希望它是同步的,那么是的,您需要向 postFunction 添加一个回调。
例如:
function myFunction(x, y, callback) {
// variable declarations
postFunction(a, b, function(err) {
// other logic for the function
//maybe check if "err" has a value here
request.get(url, function(error, response, body) {
// request code here
callback(somedata, otherFunctionThatDoesntMatterHere(blah));
});
});
}
function postFunction(a, b, next) {
// other logic for the function
var dataToSend = "XML HERE";
request.post({
url: url,
body: dataToSend,
headers: {'Content-Type' : 'text/xml'},
function(error, response, body) {
if (error) {
console.log(error);
next(error);
}
else if (response.statusCode !== 200) {
console.log('Invalid Status Code Returned:', response.statusCode);
next('Invalid Status Code Returned:' + response.statusCode);
}
else if (!error && response.statusCode == 200) {
console.log('POST RESPONSE: ', body);
next(null);
}
}
);
}
这会将您要触发的其余代码放在 postFunction 的回调中,要求它在触发任何其他代码之前先完成。当然,这会增加函数的整体 运行 时间,因为它现在必须等待才能继续 运行。如果您正在执行 CPU 密集型任务,请小心锁定事件循环。
另外,为了对抗回调地狱的丑陋,你可以使用像异步瀑布这样的东西来一个接一个地链接函数:https://www.npmjs.com/package/async-waterfall
我是回调地狱世界的新手,有点卡住了。我正在做一些分析工作,所以每次调用一个函数时,我都会调用一个执行 request.post 的函数来记录我们服务器上的请求。然而,在这些原始函数中的每一个中,request.get 都对 return 一些信息进行了处理。因此,我实质上是在调用一个函数,该函数在另一个需要在该函数之后发出请求的函数中发出请求。代码本身比我刚才描述的要复杂得多(而且复杂,我的意思是又长又烦人),所以这里是简化版:
function myFunction(x, y, callback) {
// variable declarations
postFunction(a, b);
// other logic for the function
request.get(url, function(error, response, body) {
// request code here
callback(somedata, otherFunctionThatDoesntMatterHere(blah));
});
}
function postFunction(a, b) {
// other logic for the function
var dataToSend = "XML HERE";
request.post({
url: url,
body: dataToSend,
headers: {'Content-Type' : 'text/xml'},
function(error, response, body) {
if (error) {
console.log(error);
}
else if (response.statusCode !== 200) {
console.log('Invalid Status Code Returned:', response.statusCode);
}
else if (!error && response.statusCode == 200) {
console.log('POST RESPONSE: ', body);
}
}
);
}
现在发生的事情是 post 函数不会在主函数结束之前 return。我知道这是节点异步性的一部分,但我希望这些同步执行。我很确定我可以通过向 post 函数添加回调来解决这个问题,但我不确定如何解决。我尝试了很多不同的方法,但恐怕我并不完全理解这一切是如何工作的。预先感谢您提供的任何帮助!
如果您真的希望它是同步的,那么是的,您需要向 postFunction 添加一个回调。
例如:
function myFunction(x, y, callback) {
// variable declarations
postFunction(a, b, function(err) {
// other logic for the function
//maybe check if "err" has a value here
request.get(url, function(error, response, body) {
// request code here
callback(somedata, otherFunctionThatDoesntMatterHere(blah));
});
});
}
function postFunction(a, b, next) {
// other logic for the function
var dataToSend = "XML HERE";
request.post({
url: url,
body: dataToSend,
headers: {'Content-Type' : 'text/xml'},
function(error, response, body) {
if (error) {
console.log(error);
next(error);
}
else if (response.statusCode !== 200) {
console.log('Invalid Status Code Returned:', response.statusCode);
next('Invalid Status Code Returned:' + response.statusCode);
}
else if (!error && response.statusCode == 200) {
console.log('POST RESPONSE: ', body);
next(null);
}
}
);
}
这会将您要触发的其余代码放在 postFunction 的回调中,要求它在触发任何其他代码之前先完成。当然,这会增加函数的整体 运行 时间,因为它现在必须等待才能继续 运行。如果您正在执行 CPU 密集型任务,请小心锁定事件循环。
另外,为了对抗回调地狱的丑陋,你可以使用像异步瀑布这样的东西来一个接一个地链接函数:https://www.npmjs.com/package/async-waterfall