Javascript Nodejs请求后接请求-同步问题

Javascript Nodejs请求后接请求-同步问题,javascript,node.js,asynchronous,request,synchronous,Javascript,Node.js,Asynchronous,Request,Synchronous,我对地狱的世界还不熟悉,有点卡住了。我正在做一些分析工作,所以每次调用一个函数时,我都会调用一个执行request.post的函数,以便在我们的服务器上记录请求。但是,在每个原始函数中,都会发出request.get以返回一些信息。所以,我本质上是在调用一个函数,该函数在另一个函数中发出请求,该函数需要在该函数之后发出请求。代码本身比我刚才描述的要复杂得多(复杂,我指的是冗长和烦人),所以下面是简化版: function myFunction(x, y, callback) { // v

我对地狱的世界还不熟悉,有点卡住了。我正在做一些分析工作,所以每次调用一个函数时,我都会调用一个执行request.post的函数,以便在我们的服务器上记录请求。但是,在每个原始函数中,都会发出request.get以返回一些信息。所以,我本质上是在调用一个函数,该函数在另一个函数中发出请求,该函数需要在该函数之后发出请求。代码本身比我刚才描述的要复杂得多(复杂,我指的是冗长和烦人),所以下面是简化版:

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函数在主函数结束之前不会返回。我知道这是节点异步性的一部分,但我希望这些是同步执行的。我很确定我可以通过向post函数添加回调来解决这个问题,但我不确定如何解决。我尝试过许多不同的方法,但恐怕我不完全理解这一切是如何运作的。提前感谢您提供的任何帮助

如果您确实希望它是同步的,那么是的,您需要向post函数添加回调

例如:

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);
        }
    }
 );
}
这会将要激发的其余代码放在post函数的回调中,要求它在激发任何其他代码之前先完成。当然,这将增加函数的总体运行时间,因为它现在必须等待才能继续运行。如果正在执行CPU密集型任务,请小心锁定事件循环


另外,为了对抗回调地狱的丑陋,您可以使用类似异步瀑布的东西来一个接一个地链接函数:

我正要发布我的解决方案,它几乎与此相同。我希望我第一次看到这个哈哈。谢谢:)