2016-11-07 37 views
-3

我在我的AJAX处理的each()循环做推到我temp阵,但最终我还是得到一个空数组。这很奇怪,我记得我曾经在each()上使用诺言,所以它没有问题。

var temp = []; 
$.ajax({ 
    type: 'GET', 
    url: '/endpoint', 
    success: function(data) { 
     $(data).each(function() { 
      //do some stuff 
      console.log(something); // working 
      temp.push(something); 
    }).promise().done(function() { 
     console.log(temp); // still empty array?! 
    }); 
}); 

更新:这里的人是如何做到了https://stackoverflow.com/a/8941358/7095330

+1

还有的[文件]中的任何内容(http://api.jquery.com/jquery。每个/)表明'.each'返回一个承诺 – Liam

+0

也许这不是一个傻瓜,在OP似乎做奇怪的事情与同步循环? – adeneo

+0

让我困惑的是大括号不匹配。有太多的收盘'}' – Liam

回答

2

减少你的脚本,你的问题是问,一切似乎是工作的罚款。希望这将有助于你发现,你的问题是,别的地方在你的代码:

var temp = []; 
 
var data = [1,2,3,4,5,6,7,8]; 
 

 
$(data) 
 
    .each(function(thing) { 
 
     //do some stuff 
 
     console.log(thing); // working 
 
     temp.push(thing); 
 
    }) 
 
    .promise() 
 
    .done(function() { 
 
     console.log(temp); // still empty array?! 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

然而promise().done()是很奇怪的;我看不出为什么你需要那里。

听起来像是map,那就是你有一个输入数组的情况下,你想改变它的内容。

var data = [1,2,3,4,5,6,7,8] 
 

 
var changedData = data.map(function (datum) { 
 
    // do stuff 
 
    return 'did stuff to ' + datum; 
 
}); 
 

 
console.log(changedData)

除非你试图做的是下面的,这仍然有效。 PEBKAC错误或许?

var temp = []; 
 
$.ajax({ 
 
    type: 'GET', 
 
    url: 'https://google.com/', 
 
    // replaced success: with error:, for example's sake 
 
    error: function(data) { 
 
     $(data).each(function() { 
 
      //do some stuff 
 
      console.log('something'); 
 
      temp.push('something'); 
 
     }).promise().done(function() { 
 
      console.log('each done', temp); 
 
     }); 
 
    }, 
 
    done: function() { 
 
     console.log('ajax done:', temp); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

我不相信任何他在'成功'回调中做的任何事情都是异步的。在这种情况下将'.each'包装成承诺与使用纯粹的同步替代无差别。除非我现在很胖,并且缺少明显的东西......在这种情况下,我很乐意知道。 – tmslnz

+0

在他尝试记录'temp'之前执行的操作是同步的,因为它都发生在'success'回调中。 – tmslnz

+0

也许你的权利... – Liam

1

你忘了一个支架}

var temp = []; 
$.ajax({ 
    type: 'GET', 
    url: '', 
    success: function(data) { 
     $(data).each(function() { 
      //do some stuff 
      console.log('something'); // working 
      temp.push('something'); 
    }).promise().done(function() { 
     console.log(temp); // still empty array?! 
    }); 
}}); 

看到https://jsfiddle.net/gw10un58/