0

coffeescirpt でオブジェクトを反復処理するときにスコープの問題が発生しています。配列のループで同様の問題がありましたが、forEach を使用して解決できたため、ループごとに新しいスコープが得られました。配列の代わりに同様の問題が発生していますが、今回はオブジェクト/辞書を使用しています。問題は、オブジェクトをループするとき、最後console.logは常にオブジェクト内の最後の人物、つまりすべての人物のデータを返すことです。これはスコーピングの問題だと思いますが、解決方法がわかりません。

for name, data of people
    console.log name
    lookup name, (err, other_data) ->
        console.log data  # this always returns the data for the last person
4

2 に答える 2

1

Ionutの答えは正しいので、賛成しました。

もう少し説明すると、発生している問題は、渡したコールバック関数が何らかの方法で非同期に実行されているためです。したがって、ループが最後まで実行され、最終的にデータが最終値に設定されます。次に、非同期コールバックが次々に実行され、データ オブジェクトにアクセスします。ループが最後まで実行されたため、データは常に最終値と等しくなり、ログに記録されます。

do ブロックは、クロージャーの省略形を提供することで問題を解決します。Ionut が提案するコードは、Javascript で次のように変換されます。

var data, name, _fn;

_fn = function(data) {
  return lookup(name, function(err, other_data) {
    return console.log(data);
  });
};
for (name in people) {
  data = people[name];
  console.log(name);
  _fn(data);
}

したがって、この場合、データはクロージャー関数に渡され、クロージャー関数は現在の値をそのスコープに保持し、ルックアップ関数を返します。ルックアップ関数は、クロージャー スコープ内の値への参照を維持します。

于 2013-03-31T03:38:07.043 に答える