Promise Resolve返回2个未定义的数组

时间:2017-06-12 11:26:41

标签: javascript promise

我正在通过承诺工作并注意到以下内容。我正在听我的控制器中的变化,如:

$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未定义,但是在解析第二个函数之前记录它时是否定义了它?

1 个答案:

答案 0 :(得分:1)

承诺仅封装一个值和一个值。更容易认为promise是函数返回的值(函数也只能返回一个值)。

所以这是无效的:

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; 
   // ...
});