2

私は無名関数を使用して、Restler のget関数を使用して戻ってきた html でいくつかの作業を実行しています。

var some_function() {
    var outer_var;
    rest.get(url).on('complete', function(result, response) {
        if (result instanceof Error) {
            sys.puts('Error: ' + result.message);
        } else {
            var inner_var;
            // do stuff on **result** to build **inner_var**
            outer_var = inner_var;
        }
    });
    return outer_var;
}

inner_varoutの値をsome_functionスコープに取得して返すにはどうすればよいですか? 私がここに書いたことは機能しません。

4

3 に答える 3

6

get 呼び出しは非同期です。時間がかかり、後でコールバックを呼び出します。ただし、get を呼び出した後、スクリプトは実行を続け、次の命令に進みます。だからここに何が起こるかです:

  • get を呼び出す
  • あなたはouter_var(まだ未定義です)を返します...時々後で...
  • get result が到着し、コールバックが呼び出されます。
  • outer_var が設定されている

some_function が非同期の値を返すようにすることはできないため、代わりにコールバックを使用し、データが処理されたらコードでそれを呼び出させる必要があります。

var some_function(callback) {
    rest.get(url).on('complete', function(result, response) {
        if (result instanceof Error) {
            sys.puts('Error: ' + result.message);
        } else {
            var inner_var;
            // do stuff on **result** to build **inner_var**
            callback(inner_var);
        }
    });
}
于 2013-07-15T07:39:09.943 に答える
2

ノードのほとんどのモジュールと同様に、Restler も非同期呼び出しを持つイベント ベースのライブラリです。そのため、実行時return outer_var;completeコールバックが呼び出されるとは限りません (一部のライブラリでは、結果がキャッシュされた場合に呼び出される可能性がありますが、非同期で呼び出されることを常に期待する必要があります)。

ログを追加すると、この動作を確認できます。

var some_function() {
    var outer_var;
    console.log("before registration of callback"); //<----------
    rest.get(url).on('complete', function(result, response) {
        console.log("callback is called");  //<----------
        if (result instanceof Error) {
            sys.puts('Error: ' + result.message);
        } else {
            var inner_var;
            // do stuff on **result** to build **inner_var**
            outer_var = inner_var;
        }
    });
    console.log("after registration of callback");  //<----------
    return outer_var;
}

したがって、この値で何かをしたい場合は、完全なコールバックからこの値で何かをする関数を呼び出す必要があります。

于 2013-07-15T07:39:01.977 に答える
-3
  1. var outer_var;関数から を削除しますsome_function
  2. var outer_var;あなたの関数の上に宣言します

ステップ 1 を実行した後は動作するはずですが、ステップ 2 は実際には必要ありません。

于 2013-07-15T07:34:15.897 に答える