Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript for循环中的AngularJS异步请求_Javascript_Arrays_Angularjs_Mongodb_Asynchronous - Fatal编程技术网

Javascript for循环中的AngularJS异步请求

Javascript for循环中的AngularJS异步请求,javascript,arrays,angularjs,mongodb,asynchronous,Javascript,Arrays,Angularjs,Mongodb,Asynchronous,我显示一个列表,每个项目都包含一个引用其他文档的ID数组(mongodb)。 当用户单击某个项目时,我希望用实际文档填充数组(=用相应的对象替换ID) 我的问题是,一旦请求完成,数据就不会应用到数组中的正确位置。我在回调函数中提交的索引可能会随着for循环的进行而增加。当请求准备就绪时,for循环可能已经完成,因此结果将附加到数组的末尾,而不是其原始位置。我尝试使用angular.copy()深度复制索引,尽管我认为这不必要。我甚至不确定int是一个对象还是一个平面数据类型,谷歌的一项小型研究并

我显示一个列表,每个项目都包含一个引用其他文档的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的解决方案。然而,在普朗克尔,由于某种原因,它并不起作用。