1

私は、おそらくJavascriptクロージャについての私の誤解であると私が信じていることに小さな問題を抱えています。

私はこのコードを持っています-

getStdOpts: function(tbl, filt) {
    var vals = new Array();

    this.srvs.getStdOptions(
        { tbl: tbl },
        {
            'ok': function(rsp) {
                for (var i in rsp) {
                    vals.push({ value: rsp[i].id, text: rsp[i].descr });
                }
            }
        }
    );
    return vals;
}

基本的に、getStdOptions呼び出し内の内部関数('ok':function ...)は新しい値をvals配列にプッシュしますが、呼び出しの外部からアクセスすると、vals配列は空になります。内部関数内からアクセスすると、valsには期待どおりにすべての要素が含まれます。

私がこの問題に取り組むことができるどんな助けでも本当に感謝します。

4

1 に答える 1

1

これがクロージャ/スコープの問題ではないかと思います。this.srvs.getStdOptionsが非同期操作の場合、はgetStdOpts常に空の配列を返します。この配列は、操作が完了するといっぱいになります。これは、記述されているように、必要になった後のことです。あなたは物事を少し違ったやり方で扱う必要があるでしょう。getStdOptsパラメータとして受け取るコールバックに直接渡してvals、匿名のコールバック内でそのコールバックを実行するthis.srvs.getStdOptions必要があります。または、コールバックを追加できるある種のpromiseオブジェクトを返す必要があります(これは基本的にvals、パラメータ)必要に応じて-匿名のコールバックでvals、「約束された」結果としての約束を解決する必要があります。

于 2012-11-30T05:04:48.820 に答える