2016-04-11 15 views
0

私はコールバック地獄の世界には新しく、ちょっと立ち往生しています。私はいくつかの分析作業をしています。そのため、関数が呼び出されるたびにrequest.post関数を呼び出し、私たちのサーバ上でリクエストを記録します。しかし、これらのオリジナルの関数では、request.getがいくつかの情報を返すようになっています。だから、私は本質的に、それを要求しなければならない別の関数の中で要求を行う関数を呼び出しています。今何が起こっているNodejsリクエストのあとにリクエスト同期の問題があります

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

ポスト機能が」doesnのことをされています。コード自体はので、ここで易しく書き直さダウンバージョンですが、私は今説明したよりも(私は長いと迷惑な意味、そして複雑で)多くの、より複雑ですmain関数の最後の前に戻ります。私はこれがノードの非同期性の一部であることを知っていますが、これらを同期して実行したいと思います。私はかなり私はポスト関数にコールバックを追加することでこれを解決することができると確信していますが、私はどのようにわからない。私はいろいろなアプローチを試みましたが、私はこれがどのように機能するか完全に理解していません。あなたが提供できるあらゆる助けをありがとうございます!

答えて

0

本当に同期させたい場合は、はい、ポストファンクションにコールバックを追加する必要があります。例えば

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

+0

私はこれとほぼ同じである私の解決策を投稿する文字通り程度でした。私はこの最初の笑を見たかった。ありがとうございました:) – redcastle

+0

母、問題ありません! – AdmanStrong

関連する問題