在循环中动态地将键/值对添加到Javascript对象

时间:2014-04-08 02:47:28

标签: javascript angularjs loops object

想要在角度工厂中创建数据对象,我可以返回控制器,但遇到一些问题:

app.factory('simpleFactory', function ($http) {
    var mykey = 'akjhas3892kh8adsak9';
    var apiResource = [{
        type: 'type1',
        abbr: 'abc'
    }, {
        type: 'type2',
        abbr: 'efg'
    }, {
        type: 'type3',
        abbr: 'hij'
    }];
    var data = {};
    var setDataKeyValues = function (key, value) {
        data[key] = value
    };
    for (var i = 0; i < apiResource.length; i++) {
        var key = apiResource[i].type;
        $http.get('http://api.com/v1/path/' + key + '/' + apiResource[i].abbr + '/anotherpath?apikey=' + mykey).success(function (info) {
            setDataKeyValues(key, info);
        });
    }
    return data;
});

Angular http请求正在返回一个JSON对象,但是当返回数据对象时,它是空的。将这些键/值添加到此对象的正确原因是什么?

2 个答案:

答案 0 :(得分:1)

$http.get是异步的,您的返回是同步的。您需要使用队列。 Angular内置了这个。

app.factory('simpleFactory', function ($http) {
    ...
    var promises = [];
    for (var i = 0; i < apiResource.length; i++) {
        var key = apiResource[i].type;
        var promise = $http.get('http://api.com/v1/path/' + key + '/' + apiResource[i].abbr + '/anotherpath?apikey=' + mykey).success(function (info) {
            setDataKeyValues(key, info);
        });
        promises.push(promise);
    }

    // Once all asynchronous HTTP GET requests are complete
    $q.all(promises).then(function () {
        // Do something with the data, e.g.
        $rootScope.apply();
    });

   return data;
});

simpleFactory用词不当。工厂方法同步返回一个对象,然后在您注入的任何位置提供该对象。您在回调中设置的值将在稍后提供。

答案 1 :(得分:0)

由于请求是异步的,因此数据值仅在回调运行后设置,但您在任何回调有机会运行之前返回数据。

如果要在返回所有数据后执行某些操作,请在每次请求某些数据时递增计数器,并在设置数据后递减计数器。然后检查计数器是否为0,并运行依赖于数据的函数。