1

ループ中にこの小さな問題が発生します。常に同じ「y」値(5)が得られ、減少または増加しません。私が欲しいのは、ajax呼び出しをX回[すべて]繰り返し、無名関数を介して応答と現在の呼び出し番号を渡すことです。あなたが私を助けてくれることを願っています。

function _shds(long, count, func) {
    for (var y = 0; y < count; y++) {
        gapi.client.load('urlshortener', 'v1', function() {
            var request = gapi.client.urlshortener.url.insert({
                'resource': {
                    'longUrl': long
                }
            });
            var resp = request.execute(function(resp) {
                func(resp.id, y);
            });
        });
    }
}
var total = 3;
var base = "soem";
var lista = ["1", "2", "3", "4", "5"];
_shds("222", total, function(data, y) {
    if (data != "undefined") {
        newbase = base.replace("soem", data);
        console.log(lista[y].uid + newbase + " pos:" + y);
    }
});​

更新:申し訳ありませんが、コードの例を次に示します:http: //jsfiddle.net/ZgXZB/

4

2 に答える 2

4

これは、最初に表示されるよりも難しい問題であり、一般的なJavaScriptの落とし穴です。何が起こっているのかというと、あなたが言うとき:

for (var y = 0; y < count; y++) {
    gapi.client.load('urlshortener', 'v1', function() {
        var request = gapi.client.urlshortener.url.insert({
            'resource': {
                'longUrl': long
            }
        });
        var resp = request.execute(function(resp) {
            func(resp.id, y);
        });
    });
}

yに渡す関数コールバックでクロージャーを作成していますget。ただし、作成したクロージャは1つだけであり、最終的な値yはですcount。あなたがしたいのはcount異なるクロージャを作成することなので、新しいスコープを導入する必要があります:

for (var y = 0; y < count; y++) {
 (function (y){      
  gapi.client.load('urlshortener', 'v1', function() {
      var request = gapi.client.urlshortener.url.insert({
          'resource': {
              'longUrl': longurl
          }
      });
      var resp = request.execute(function(resp) {
          func(resp.id, y);
      });
  });
 })(y);      
}

私はそれがそれをするべきだと信じています。JavaScriptで新しいスコープを作成するには、新しい関数を宣言する必要がありyます。その関数にパラメーターとして渡すことにより、の値ごとに新しいクロージャーを作成しますy

于 2012-07-18T19:31:19.877 に答える
2

問題は、コールバックが戻った後、つまりforループが終了したi の値を取得しようとしていることです。あなたがする必要があるのは、あなたが最初に次の中間コールバックを構築するときにコールバックに渡したい値です:bindi$.get

function _short(longurl, count, func) {
    for (var y = 0; y < count; y++) {
        gapi.client.load('urlshortener', 'v1', function() {
            var request = gapi.client.urlshortener.url.insert({
                'resource': {
                    'longUrl': longurl
                }
            });
            var resp = request.execute((function(y, resp) {
                func(resp.id, y);
            }).bind(this, y));
        });
    }
}
var totalchat = 10;
var base = "soem";
var listachat = ["1", "2", "3", "4", "5"];
_short("222", 3, function(data, y) {
    if (data != "undefined") {
        newbase = base.replace("soem", data);
        console.log(listachat[y].uid + newbase + " pos:" + y);
    }
});

bindの値がthis最初のパラメーター(私が設定したもの)thisにバインドされ、残りのすべての引数が関数の最初の引数にバインドされ、返される関数が新しい引数のセットを受け取る新しい関数を作成します(この場合、data引数のみが元の関数から残ります。これは$.get)のコールバック署名と一致します。

于 2012-07-18T19:28:05.737 に答える