15

私はイベントベースのプログラミング(node.jsを使用)にかなり慣れていません。何度も何度も何度も出くわす特定の問題があるため、それについて理解していないことがあると思います。

要するに、その問題は、邪魔になっていると思われる非同期性に対処することです。私の場合、これはほとんどの場合、設計上非ブロックでコールバックベースの API を促進するサードパーティ ライブラリを使用するときに現れます。

例: 現在、 mranney の node-redis ライブラリを多用するものを書いています。私のプログラムは RSS フィードをスクレイピングし、その結果を redis に入れています。私は、redis の一般的な戦略であると信じているものを使用しています。

  1. フィードをスクレイプし、結果を のようなキーを持つ redis ハッシュとして保存しますfeed:<feedId>:results:<timestamp>
  2. の下に最新の結果への参照を格納しますfeed:<feedId>:latest
var redis = require("redis");
var client = redis.createClient();

var get_latest_results = 関数 (feedId) {
    client.get('feed:+ feedId + ':latest', function (err, res) {
        var latest_reading_key = res.toString();
        client.hgetall(latest_reading_key, function (err, res) {
            var latest_reading = res;
        });
    });
    // この関数の戻り値を指定するには?
}

関数が終了する準備が整うまで latest_reading が定義されないためreturn latest_reading、関数の最後に配置すると失敗します。がコールバックを参照し、 によって無視されるため、呼び出し内に配置すると失敗します。get_latest_resultsreturn latest_readinghgetallreturnget_latest_results

これは、私が常に書き込んでいるような状況の一例にすぎません。よくわからないので、四角いペグを丸い穴に打ち込もうとしているのかもしれません。このクラスの問題を解決するためのハックではない方法があるはずです。

4

1 に答える 1

28

同期パラダイムで関数を記述しているため、非同期に苦労しています。

非同期では、イベントにコールバックをアタッチする必要があります。のような非同期関数からの結果を期待するべきではありませんが、結果のget_latest_results()準備ができたときに呼び出される引数としてコールバック関数を渡す必要があります。コールバックは、結果に対して実行する必要があるすべてのことを実行します。

var get_latest_results = function (feedId, readyCallback) {
    client.get('feed:' + feedId + ':latest', function (err, res) {
        var latest_reading_key = res.toString();
        client.hgetall(latest_reading_key, function (err, res) {
            readyCallback(res);                           //--- Trigger Callback
        });
    });
    // how do I specify a return value for this function? //--- You don't
}

次に、次のように関数を呼び出すことができます。

get_latest_results(1000, function (result) {
   //--- Do whatever needs to be done with the latest result...
});
于 2010-10-12T21:19:46.333 に答える