私はイベントベースのプログラミング(node.jsを使用)にかなり慣れていません。何度も何度も何度も出くわす特定の問題があるため、それについて理解していないことがあると思います。
要するに、その問題は、邪魔になっていると思われる非同期性に対処することです。私の場合、これはほとんどの場合、設計上非ブロックでコールバックベースの API を促進するサードパーティ ライブラリを使用するときに現れます。
例: 現在、 mranney の node-redis ライブラリを多用するものを書いています。私のプログラムは RSS フィードをスクレイピングし、その結果を redis に入れています。私は、redis の一般的な戦略であると信じているものを使用しています。
- フィードをスクレイプし、結果を のようなキーを持つ redis ハッシュとして保存します
feed:<feedId>:results:<timestamp>
。 - の下に最新の結果への参照を格納します
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_results
return latest_reading
hgetall
return
get_latest_results
これは、私が常に書き込んでいるような状況の一例にすぎません。よくわからないので、四角いペグを丸い穴に打ち込もうとしているのかもしれません。このクラスの問題を解決するためのハックではない方法があるはずです。