如何防止阵列混乱? (AngularJs)

时间:2018-07-22 02:15:02

标签: arrays angularjs sorting object resolve

我通过“ sort”函数传递了一系列对象,并正确地对其进行了排序,但是通过在$ js.d中使用$ d.resolve(myList)发送promise,该订单似乎又丢失了。如何防止这种情况发生?

var deferred = $q.defer();
var requests = $q.all([getValue1(obj), getValue2(obj)]);

requests.then(function (values) {
    var toOrder = _.union($scope.values, values[0], values[1]);
/*
This are values
[
    { name: '11A.1C.8', value: 21 },
    { name: 'F1.8C.10', value: 37 },
    { name: '11A.2C.14', value: 45 },
    { name: '11A.1C.15', value: -12 },
    { name: '99R.963/5C-134-23' },
    { name: '11A.2C.18', value: 37 },
    { name: '11A.2C.17', value: 37 },
    { name: '11A.1C.9', value: 37 },
    { name: 'AAA.BBB.CCC', value: 37 },
    { name: 'F1.8C.10-1', value: 37 },
    { name: '99R.963/5C-134-23-94', value: 37 }
]*/
    deferred.resolve(sort(toOrder));
});
            
function sort(lista) {
    lista.sort(function (a, b) {
        if (a.name > b.name) { return 1; }
        if (a.name < b.name) { return -1; }
        return 0;
      });

      return lista;
}

一切正常,直到结果发送到“解析”为止。那是订单再次丢失的时候。 我需要帮助!

1 个答案:

答案 0 :(得分:0)

在处理$q.defer块时避免使用.then。而是返回值以创建新的Promise:

var requests = $q.all([getValue1(obj), getValue2(obj)]);

var newPromise = requests.then(function (values) {
    var sortedValues = sort(values);
    return sortedValues;
});

array.sort方法对in-place进行排序。明智的做法是在排序之前先进行复制:

function sort(lista) {
    var copiedLista = lista.concat();
    copiedLista.sort(function (a, b) {
        if (a.name > b.name) { return 1; }
        if (a.name < b.name) { return -1; }
        return 0;
    });
    return copiedLista;
}

然后从新的承诺中提取值:

newPromise.then(function(sortedValues) {
    console.log(sortedValues);
};