0

私はIN.API.PeopleSearch()for ループから呼び出しています。この for ループは ajax 成功メソッドにありますが、for ループの実行が完了する前に ajax メソッド complete が呼び出されます。

for ループが完了するまで停止したい。

$.ajax({
        type: 'GET',
        dataType: 'json',
        url: "get_data.htm",
        async : false,
        success: function(data, textStatus ){
            for(i in data){
                searchClick(data[i].firstName,data[i].lastName);
                }
                alert(resultArray);//here i want to send the response to server side
            }
        },
        error: function(xhr, textStatus, errorThrown){
           alert('request failed');
        }
      });

ここに私のsearchClick関数があります:

function searchClick(firstName, secondName) {
  if (!IN.ENV.auth.oauth_token) {
    alert("You must login w/ LinkedIn to use the Search functionality!");
    return;
  }

  IN.API.PeopleSearch()
      .fields("id", "firstName", "lastName","emailAddress","headline","industry","pictureUrl","positions",
            "summary","numConnections")
    .params({
      "first-name": firstName,
      "last-name": secondName
    })
    .result(function(result, metadata) {

    for (i in result.people.values) {
          try{
              resultArray[i] = result.people.values[i];
          }catch(err){
              alert(err);
              }
    }

    });
}

alert(resultArray)for ループの完了前に呼び出されます。これを処理する方法。

4

2 に答える 2

1

あなたの質問が得られるかどうかはわかりませんが、おそらく次のようなものがうまくいくでしょう:(テストされていません)

var Queue = function(callback) {
  this.count = 0;
  this.done = 0;
  this.callback = callback;
};

Queue.prototype.oneDone = function() {
  if (++this.done == this.count) {
    this.callback();
  }
}

Queue.prototype.process = function(data, callback) {
  this.count = data.length;

  for (i in data ) {
    callback(data[i], this);
  }
};

$.ajax({
  type: 'GET',
  dataType: 'json',
  url: "get_data.htm",
  async : false,
  success: function(data, textStatus) {
    var myQueue = new Queue(function() {
      alert(resultArray); //here i want to send the response to server side
    });
    myQueue.process(data, function(item, queue) {
      searchClick(item.firstName, item.lastName, queue);
    });
  },
  error: function(xhr, textStatus, errorThrown){
    alert('request failed');
  }
});

function searchClick(firstName, secondName, queue) {
  if (!IN.ENV.auth.oauth_token) {
    alert("You must login w/ LinkedIn to use the Search functionality!");
    return;
  }

  IN.API.PeopleSearch()
    .fields("id", "firstName", "lastName","emailAddress","headline","industry","pictureUrl","positions",
            "summary","numConnections")
    .params({
      "first-name": firstName,
      "last-name": secondName
    })
    .result(function(result, metadata) {
      for (i in result.people.values) {
        try {
          resultArray[i] = result.people.values[i];
        } catch(err) {
          alert(err);
        }
      }
      if (queue) {
        queue.oneDone();
      }
    });
  }
于 2013-03-11T22:05:44.207 に答える
0

あなたが何をしているのか正確にはわかりませんが、非同期という1つの方法があると言えます

    Function.prototype.async = function () {
        setTimeout.bind(null, this, 0).apply(null, arguments);
        };

これにより、次のようなコードを記述できます。

   alert.async("This will be displayed later.");
   alert("This will be displayed first.");

したがって、他のイベントが完了すると、.asyncを含むコードが呼び出されます。


それ以外の場合は、

 if(xmlhttp.readyState == 4 && xmlhttp.status == 200)

ドキュメントの準備ができているかどうかを確認するには、/ fill/successを送信します。これはRawAJAXメソッドです。:)

これがお役に立てば幸いです:)

于 2013-03-12T05:11:02.007 に答える