Обещание Resolve возвращает 2 массива один неопределенный

1

Я прокладываю себе путь через обещания и замечаю следующее. Я слушаю изменения в моем контроллере, например:

$scope.$on("New Data", function(event, data, ID) {
    processTripData(data, ID).then(function(result) {
        setTypeDistributionBar(result).then(function(data, labels) {
            $scope.distributionLabels = labels;
            $scope.distributionData = data;
            console.log(labels); // undefined, why?
            console.log(data); // defined, as expected
        })
    })
})

Проблема заключается в том, что labels не определены, однако в функции setTypeDistributionBar она определена до того, как она будет решена:

var setTypeDistributionBar = function(trips) {
    var distributionData = [];
    var distributionLabels = [];
    var types = ['Transport', 'Office & Work'];

    return new Promise(function(resolve, reject) {
        for(var i=0; i < trips.length; i++) {
            var first = trips[i].type.slice(0,1);
            var second = trips[i].type.slice(2,3);
            distributionLabels.push(types[first-1] + ' -> ' + types[second-1]);
            distributionData.push(trips[i].count);
        }
        if(i === trips.length) {
            console.log(distributionLabels); // defined, as expected
            resolve(distributionData, distributionLabels);
        }
    })
}

Вопрос: Почему labels не определены в then части первой функции, но она определяется при регистрации в журнале перед ее решением во второй функции?

Теги:
promise

1 ответ

1
Лучший ответ

Обещание заключает только одно значение и одно значение. Легче считать, что обещание - это в основном значение, возвращаемое функцией (функция также может возвращать только одно значение).

Таким образом, это недействительно:

setTypeDistributionBar(result).then(function(data, labels) {

поскольку function получит только один аргумент.

Чтобы решить эту проблему, вы можете просто вернуть объект вместо двух значений:

resolve({
    data: distributionData,
    labels: distributionLabels
});

И тут вы можете сделать что-то вроде:

setTypeDistributionBar(result).then(function(r) {
   $scope.distributionLabels = r.labels;
   $scope.distributionData = r.data; 
   // ...
});
  • 0
    Большое спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню