2017-04-05 24 views
0

的 “类型” 工作的每个循环是在格式["hourAverage","hourMedian","dayAverage","dayMedian","weekAverage","weekMedian","monthAverage","monthMedian"]对于承诺不处于被传递参数angularjs

来源:

$scope.buildCharts = function(types){ 
    var deferred = $q.defer(); 
    var promises = []; 

    types.forEach(function(type){ 
       $scope.prepareData(type); 
       deferred.resolve([ 
       { 
        title: type, 
        curveType: 'function', 
        legend: { position: 'bottom' } 
       },type]); 
       promises.push(deferred.promise); 
    }); 
    return $q.all(promises); 
}; 

输出:

[ 
    [ 
    { 
     "title": "hourAverage", 
     "curveType": "function", 
     "legend": { 
     "position": "bottom" 
     } 
    }, 
    "hourAverage" 
    ], 
    [ 
    { 
     "title": "hourAverage", 
     "curveType": "function", 
     "legend": { 
     "position": "bottom" 
     } 
    }, 
    "hourAverage" 
    ], 
    [ 
    { 
     "title": "hourAverage", 
     "curveType": "function", 
     "legend": { 
     "position": "bottom" 
     } 
    }, 
    "hourAverage" 
    ], 
    [ 
    { 
     "title": "hourAverage", 
     "curveType": "function", 
     "legend": { 
     "position": "bottom" 
     } 
    }, 
    "hourAverage" 
    ], 
    [ 
    { 
     "title": "hourAverage", 
     "curveType": "function", 
     "legend": { 
     "position": "bottom" 
     } 
    }, 
    "hourAverage" 
    ], 
    [ 
    { 
     "title": "hourAverage", 
     "curveType": "function", 
     "legend": { 
     "position": "bottom" 
     } 
    }, 
    "hourAverage" 
    ], 
    [ 
    { 
     "title": "hourAverage", 
     "curveType": "function", 
     "legend": { 
     "position": "bottom" 
     } 
    }, 
    "hourAverage" 
    ], 
    [ 
    { 
     "title": "hourAverage", 
     "curveType": "function", 
     "legend": { 
     "position": "bottom" 
     } 
    }, 
    "hourAverage" 
    ] 
] 

回答

2

这说明一个承诺只能用一个价值来解决。对同一个延迟对象的任何进一步的resolve调用都不起作用。这就是为什么你一次又一次地得到第一个对象的价值。这是由Promises/A+ specifications, point 2.1.2(重点煤矿)要求的行为:

2.1.2完成时,一个承诺:

          2.1.2.1不能转换为任何其他国家。

          2.1.2.2必须有一个值,这不能改变

当然,如果被允许更改承诺的价值,那么你还是不会有理想的结果,因为那么结果本来还有最后的重复对象值。

为了解决这个问题,内循环创建一个新的Deferred对象,让你始终解决新的承诺:

移动这样的:

var deferred = $q.defer(); 

进入forEach回调:

types.forEach(function(type){ 
    var deferred = $q.defer(); 
    // etc...