Javascript for循环中的AngularJS异步请求
我显示一个列表,每个项目都包含一个引用其他文档的ID数组(mongodb)。 当用户单击某个项目时,我希望用实际文档填充数组(=用相应的对象替换ID) 我的问题是,一旦请求完成,数据就不会应用到数组中的正确位置。我在回调函数中提交的索引可能会随着for循环的进行而增加。当请求准备就绪时,for循环可能已经完成,因此结果将附加到数组的末尾,而不是其原始位置。我尝试使用angular.copy()深度复制索引,尽管我认为这不必要。我甚至不确定int是一个对象还是一个平面数据类型,谷歌的一项小型研究并没有给出明确的答案Javascript for循环中的AngularJS异步请求,javascript,arrays,angularjs,mongodb,asynchronous,Javascript,Arrays,Angularjs,Mongodb,Asynchronous,我显示一个列表,每个项目都包含一个引用其他文档的ID数组(mongodb)。 当用户单击某个项目时,我希望用实际文档填充数组(=用相应的对象替换ID) 我的问题是,一旦请求完成,数据就不会应用到数组中的正确位置。我在回调函数中提交的索引可能会随着for循环的进行而增加。当请求准备就绪时,for循环可能已经完成,因此结果将附加到数组的末尾,而不是其原始位置。我尝试使用angular.copy()深度复制索引,尽管我认为这不必要。我甚至不确定int是一个对象还是一个平面数据类型,谷歌的一项小型研究并
我以前遇到过类似的问题,但能够解决它,但这次我不确定如何处理这个问题。有什么提示吗?异步调用将在调用时采用“i”的值。因此,您需要编写一个helper函数来保存i的值。这样的办法应该行得通
function fetchSubItem ( id, callback ) {
function helper(i) {
$timeout( function(){ callback( sideList[i] ); }, 1000 ); // to simulate asynchronicity
}
var found = false
for( var i=0; i < sideList.length; i++ ) {
if ( sideList[i].id == id ) {
found = true;
helper(i);
break;
}
}
if ( !found ) callback( "SubItem "+id+" not found." );
}
函数fetchSubItem(id,回调){
功能助手(i){
$timeout(function(){callback(sideList[i]);},1000);//模拟异步性
}
发现的var=false
对于(变量i=0;i
您需要通过将当前迭代的i
传递到fetchSubItem()
for( var i=0; i < item.subItems.length; i++ ) {
// in the real world app fetchSubitem does an http api call
fetchSubItem( item.subItems[i], i, function(result, i){
// this happens long after the for loop and all finished
item.subItems[i] = result;
});
}
// ....
function fetchSubItem ( id, j, callback ) {
var found = false
for( var i=0; i < sideList.length; i++ ) {
if ( sideList[i].id == id ) {
found = true;
$timeout( function(){ callback( sideList[i], j ); }, 1000 ); // to simulate asynchronicity
break;
}
}
if ( !found ) callback( "SubItem "+id+" not found.", j );
}
for(变量i=0;i
Plunker:创建一个传入“i”的助手函数,并让助手函数调用超时。然后索引将被保存。我认为这个解决方案应该在某种程度上等同于Anthony的解决方案。然而,在普朗克尔,由于某种原因,它并不起作用。