Javascript 为什么我的jquery.get()结果不能按我给出的顺序显示

Javascript 为什么我的jquery.get()结果不能按我给出的顺序显示,javascript,jquery,ajax,api,google-url-shortener,Javascript,Jquery,Ajax,Api,Google Url Shortener,我正试图通过javascript制作一个google shortener分析工具,这是我的代码: <script> function makeRequest() { for (var i=0; i < shortUrl.length; i++){ var url = shortUrl[i]; var request = gapi.client.urlshortener.url.get({ 'shortUrl': url,

我正试图通过javascript制作一个google shortener分析工具,这是我的代码:

 <script>

  function makeRequest() {
    for (var i=0; i < shortUrl.length; i++){
      var url = shortUrl[i];
      var request = gapi.client.urlshortener.url.get({
        'shortUrl': url,
        'projection':'FULL',
      });
      request.execute(function(response) {
        console.log(response); //here is the problem begin
        var result = {
          short: response.id,
          clicks: response.analytics.allTime.shortUrlClicks
        };
        appendResults(result, i);         
      });
    }
  }

  function load() {
    gapi.client.setApiKey('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
    gapi.client.load('urlshortener', 'v1', makeRequest);
  }
</script>
<script src="https://apis.google.com/js/client.js?onload=load"></script>

函数makeRequest(){
对于(var i=0;i
每次的结果都会让我不一样! 前任: 短URL[1,2,3,4] 它将返回3,2,1,4或1,2,4,3……等

我的代码怎么了? 是异步问题吗?我怎样才能修好它? 请帮帮我!
因为ajax是异步的。你必须使用承诺。 jQuery示例

var promises = [];
for (var i=0; i < shortUrl.length; i++){

  var dfd = new $.Deferred;

  var url = shortUrl[i];
  var request = gapi.client.urlshortener.url.get({
    'shortUrl': url,
    'projection':'FULL',
  });
  request.execute((function(dfd){return function(response) {
    dfd.resolve(response);      
  };})(dfd));

  promises.push(dfd.promise());
}

$.when.apply($, promises).done(function(){
  promises = undefined;
  for(var i in arguments){
    var response = arguments[i];
    console.log(response); //here is the problem begin
    var result = {
      short: response.id,
      clicks: response.analytics.allTime.shortUrlClicks
    };
    appendResults(result, i);  
  }
});
var承诺=[];
对于(var i=0;i
我的工作代码:

var promises = [];

var request = function(i, callback){
setTimeout(function(){return callback(i);},100 - i);  
}

for (var i=0; i < 10; i++){

  var dfd = new $.Deferred;

  request(i, (function(dfd){return function(response) {
    dfd.resolve(response);      
  };})(dfd));

  promises.push(dfd.promise());
}

$.when.apply($, promises).done(function(){
  promises = undefined;
  for(var i in arguments){

    console.log(arguments[i]); 

  }
});
var承诺=[];
var请求=函数(i,回调){
setTimeout(函数(){return callback(i);},100-i);
}
对于(变量i=0;i<10;i++){
var dfd=新的递延美元;
请求(i)(函数(dfd){返回函数(响应){
解决(响应);
})(dfd);;
promises.push(dfd.promise());
}
$.when.apply($,promissions).done(函数(){
承诺=未定义;
for(参数中的变量i){
log(参数[i]);
}
});

使用类型为get和async的$.ajax()代替get():false@user8888只是不,从来没有。忘记
async:false
选项甚至存在。@AnthonyGrist如果可以的话,我会+1000该注释@我会忘记给我一个理由哦
async:false
我多么恨你,让我数一数。。。。1.它会导致浏览器事件循环暂停,2。导致“页面未响应错误”,3。是阿贾克斯,不是SJAX!想法正确,执行不力。。。(例如,参数中变量i的
?!)我的控制台:未捕获类型错误:未定义不是一个函数它对我不起作用,是不是出了什么问题@阿尔尼塔克你什么意思?Is(对于参数中的var i)是一种不好的方式吗?
对于。。。in
用于枚举对象,而不是数组。此外,解析调用可以直接写入
request.execute(dfd.resolve)
-
response
参数仍然会被传递,它将被附加到右侧的
Deferred
。我没有测试该代码。when.apply必须使用所有响应调用done回调。