【问题标题】:Dynamically adding key/value pairs to Javascript object in a loop在循环中动态地将键/值对添加到 Javascript 对象
【发布时间】:2014-05-20 12:51:12
【问题描述】:

希望在 Angular 工厂中创建数据对象,我可以返回控制器,但有一些问题:

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 对象,但是当返回数据对象时,它是空的。将这些键/值添加到此对象的正确原因是什么?

【问题讨论】:

    标签: javascript angularjs loops object


    【解决方案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 用词不当。工厂方法同步返回一个对象,然后在您注入它的任何地方提供该对象。您在回调中设置的值稍后可用。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-19
        • 1970-01-01
        • 1970-01-01
        • 2016-02-11
        • 1970-01-01
        • 2022-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多