将 Angular 的文件异步加载到对象数组中并保持顺序

Async loading files with Angular into an object array and keeping their order

我没有加载脚本,我正在将 XML 文件读入对象数组。 我的第一次 [愚蠢] 尝试是这样的:

for (var i = 1; i < n; i++) {
    var filePath = "xml/chapter_"+i+".xml";
    $http.get( filePath ).success(function (data) {
        $scope.chaptersData.push (data._chapter); 
    });
}

我很快发现这不好,因为数组将按照文件 完成 加载的顺序填充,而不是它们开始时(竞争条件)和较小的那些将首先完成。我不能使用 'i' 的值,因为它当然会在任何加载完成之前很久就达到 'n'。

之后我认为 success(function (data, i) { 会起作用,但它没有。我没有简单的想法,在想出某种 Rube Goldberg kludge 之前,我想我会问互联网的智慧是否有 'right' 方法来做到这一点。

一样把数据作为一个对象来获取
{
  order: [] // just your chapter id or whatever identifier value in desired order
  data: // whatever you're getting now 
}

在你的 .success 中(顺便说一下,它已经贬值了,你应该使用 .then() 代替)只是做

orderedChapters = [];

for (var i = 0; i < order.length; i++) {
  for (var j = 0; j < data.length; i++) {
    if (order[i] == data[j].id) {
      orderedChapters.push(data[j]);
    }
  }
}

您可以将 i 传递给执行请求的函数。

for (var i = 1; i < n; i++) {
    getFile(i);
}

function getFile(index){
    var filePath = "xml/chapter_" + index + ".xml";
    $http.get( filePath ).success(function (data) {
        $scope.chaptersData[index] = data._chapter; 
    });
}

getFile函数中,参数index的值不会随着外部函数i的改变而改变。所以当成功函数执行时它仍然是它的初始值并且可以用于填充数组。