0

この質問はおそらく何百万回も聞かれると思いますが、とにかく試してみます. そのため、私は Python と Ruby に慣れており、命令型コード ブロックとオブジェクトとメソッドを「ブロック」し、参加したプロジェクトのためにこの新しいノードのことを学ぼうとしています。試してみてください。非同期コールバックと戻り値の受け渡しについて頭を悩ませることはできません。

これが私のコードです:

var getAnHttp = function getAnHttp (args, callback) {                   
  var req = http.request(args, callback);                               

  req.on('error', function(errmsg) {                                     
    console.log('problem with request\t' + errmsg.message);              
  });                                                                   

  req.end();                                                            
};                                                                      

var getWebPageBody = function getWebPageBody (res) {                    
  var pageRes = "";                                                     

  res.setEncoding('utf8');                                              
  res.on('data', function(requestBody) {                                
    pageRes = requestBody;                                              
    console.log('[ DEBUG ] BODY:\t' + pageRes);                         
  });                                                                   
  res.on('end', function() {                                            
    return pageRes;                                                     
  });                                                                   
};                                                                      

exports.captureLink = function captureLink(targetLink) {                
  getAnHttp(targetLink, getWebPageBody);                              
};

そして実際にそれを呼び出します:

var crawl   = require('../grab_site');

var aGreatSite    = { hostname : 'hotwebcrawlingaction.xxx',
                      port     : 80,
                      path     : '/asyncpron',
                      method   : 'GET'
                    };

var something = crawl.captureLink(aGreatSite);

getWebPageBody は私の出力を印刷しますが、関数を介してバブルアップするためのリターンを得ることができません。私は同期の方法で何かを呼び出し、非同期の方法で何かを呼び出していることを知っていますが、これを完全に整理することはできません。確かにこれを 1 つの大きな関数に入れることもできますが、ハッキングするのではなく、これを正しく実行しようとしています。

とにかく初心者の質問で申し訳ありません-私は機能的であると同時にOOP +命令的であろうとしているように感じます-私は他の多くの例を見ますが、カルトを積み込んだり、メアリーを歓迎したりしないようにしています。

4

1 に答える 1

4

非同期関数は、非同期で取得する必要があるものを返すこと はありません。getWebPageBodyあなたの場合は戻りundefined、後でコールバックが発生します。

同期プログラミングでは、値を返します。ただし、非同期では、コールバック関数への引数として提供します。

代わりに、関数がコールバック引数を受け入れるようにし、完了したらそれを呼び出すだけです。

var getWebPageBody = function(res, callback) {                    
  var pageRes = "";                                                     

  res.setEncoding('utf8');                                              
  res.on('data', function(requestBody) {                                
    pageRes = requestBody;                                              
    console.log('[ DEBUG ] BODY:\t' + pageRes);                         
  });                                                                   
  res.on('end', function() {
    callback(pageRes); // invoke callback
  });
};

// and call it
getWebPageBody(res, function(pageRes) {
  // pageRes is now the thing you expect, inside this function.
});

非同期アクションをトリガーした関数を呼び出すと、そこreturnから値が取得されることはありません。コールバックがすべてです。他の何かのコールバックから、独自のコールバックを起動します。

于 2013-06-04T23:06:08.653 に答える