1

だから私は関数を持っていると言います:

function grabOldestJob() {
  var client = mysql.createClient({
    user: dbConfig['USER'],
    password: dbConfig['PASS'],
  });

  client.query('USE '+dbConfig['DATABASE']);

  client.query('SELECT url FROM '+dbConfig['JOB_TABLE']+' ORDER BY added ASC LIMIT 1 ',
    function selectCb(err, results, fields, passed) {
      if (err) {
        throw err;
      }
      client.end();
      fetchFeed(results[0]['url']);
    }
  );
}

必要なのは、インライン関数に埋め込まれたresults [0] ['url']です。そのため、その変数をその関数から取得して、grabOldestJob関数を返すか、別の関数をに渡すことができます。インライン関数なので、results[0]['url']をパラメーターとして使用できます。

私はnode.jsの概念に非常に慣れていないので、コードを可能な限り「適切」にしたいと考えています。この関数はプロセスの最初のものであり、データベースからURLを引き出し、それを渡してリモートサーバーからフェッチし、xmlフィードを解析して、特定のビットをデータベースに保存します。ノードの機能を使用して、「一度に多くのことを実行する」ことを望んでいます。同時に多くのフィードをフェッチ->解析->保存できるようになります。このためのベストプラクティスのヒントも大歓迎です。

4

2 に答える 2

1

これにはコールバック関数を使用します。

client.query(query,callback)関数のように。データと、処理が完了した場合に呼び出されるコールバック関数を渡します。関数でも同じことを行いますfetchFeed(url,callback)

...
client.end();
fetchFeed(results[0]['url'],function(result){
    // here 'result' contains the fetched feed and can be stored into the database
});
...

function fetchFeed(url,cb){
    // download feed here and call cb(downloaded_data) when finished, passing the downloaded data to the cb() function
}

ご覧ください:node.jsイベントループを理解する

于 2012-04-20T01:19:57.120 に答える
0

外部スコープで定義された各変数は、外部スコープの内部スコープに表示されます。これは基本的に、キーワード「var」を使用して関数で変数を定義すると、ネストされた関数から見えるようになることを意味します。一方、「var」キーワードを指定せずに変数を定義すると、グローバルスコープに表示されます。次に例を示します。

(function () {
  var v = 5;

  (function () {
    v = 3;
  })();

  console.log(v);
})();

これにより、3が出力されます。したがって、引数を内部関数の外部に表示したい場合は、引数をグローバル変数にコピーする必要があります(変数がガベージコレクションされる可能性があるため、参照についてはよくわかりませんか?)。このような

(function () {
  var v = 5;

  (function (n) {
    v = n;
  })(42);

  console.log(v);
})();

これで42が出力されます。

于 2012-04-20T01:09:43.590 に答える