0

この拡張機能は、Goo.gl URL 短縮サービスを呼び出し、その応答を 1 つの文字列にまとめようとします (電子メールの目的で)。ただし、非同期であるため、コードは短縮 URL を追加する前に先に進みます。続行する前に文字列に追加するにはどうすればよいですか?

for(i;i<length;i++){
      getShortURL(tabs[i].url, function(short_url) { 
      string += encodeURL(short_url); 
      });
    }
//do something with string... 

//
function getShortURL(long_url, callback ){
...
}
4

2 に答える 2

3

You could continue your actions inside the callback after the url string has returned.

for(i;i<length;i++){
      getShortURL(tabs[i].url, function(short_url) { 
      string += encodeURL(short_url); 
      //do something with string... 
      });
    }

//
function getShortURL(long_url, callback ){
...
}

if the code need to run after all the urls have returned use a condition checking that this is your last code.

This might work for you:

for(var i=0,x=0;i<length;i++){
      getShortURL(tabs[i].url, function(short_url) { 
          string += encodeURL(short_url); 
          x++;
          if (x === length) {
              //do something with string... 
          }
      });
    }

//
function getShortURL(long_url, callback ){
...
}
于 2012-11-06T15:55:19.943 に答える
1

実際には2つの問題があります。1つは、非同期メソッドがすぐに返されることです。2つ目は、呼び出しが非同期であるため、送信したのと同じ順序で返される保証がないことです。

あなたはこのようなことをすることができます:

var strings = [];
for(i;i<length;i++){
      getShortURL(tabs[i].url, function(short_url) { 
          string[i] = encodeURL(short_url);
      });
}

// wait until the array is filled (use setTimeout) and then construct the final string from the array.
于 2012-11-06T16:01:32.577 に答える