我有一个小函数,用于处理ajax请求并从中获取数据。
一旦我的所有JSON都聚合在一个数组中,我就会发起一个事件。
我的问题是我的变量mySources,一个数组,在进程中被修改。在事件发生之前,正如预期的那样,它是一个包含4个数组的数组,但是在“被监听”之后它只是一个数组(甚至不是数组中的一个数组而只是第一个数组)
function setSources(){
var deffereds = [];
if (arguments.length == 0)
{
deffereds.push(getTweets()),
deffereds.push(getFacebookstatuses()),
deffereds.push(getCampaigns()),
deffereds.push(getArticles())
}
else
{
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] == 'tweet'){
deffereds.push(getTweets())
}
else if (arguments[i] == 'facebookstatus'){
deffereds.push(getFacebookstatuses())
}
else if (arguments[i] == 'campaign'){
deffereds.push(getCampaigns())
}
else if (arguments[i] == 'article'){
deffereds.push(getArticles())
}
}
}
$.when.apply(null,deffereds).done(function(){
var mySources = new Array();
for (var i = 0; i < arguments.length; i++) {
mySources[i]=$.parseJSON(arguments[i][2].responseText).objects;
};
console.log(mySources); **// This gives me an array of 4 arrays as expected**
$(document).trigger('cal/results',mySources);
});
$(document).on('cal/mySources', function(e,mySources){
console.dir(mySources); **// This gives me only the first of the 4 arrays**
});
};
答案 0 :(得分:0)
将数组作为extraParameters
传递给$.trigger
时,数组将被“取消装箱”,并且每个元素都作为单独的参数传递给事件处理程序。因此,您的事件处理程序实际上正在接收:
function(e, mySources0, mySources1, mySources2, ...) { }
一个简单的解决方案是在调用trigger
时将参数包装在另一个数组中:
$(document).trigger('cal/results', [mySources]); // Note the extra brackets
所以这应该是一个包含四个数组的数组的数组...... JavaScript很有趣!