q.defer deferred.resolve 已弃用

q.defer deferred.resolve is deprecated

我刚刚看到这段代码已被弃用,我一直在尝试遵循本指南:http://www.codelord.net/2015/09/24/$q-dot-defer-youre-doing-it-wrong/ 以正确的方式使用它,但我似乎无法让它工作。有人可以帮我吗?

function fetchPlayers(callback) {

            var deferred = $q.defer();

            $http.get(URL)
                .success(function (response) {
                    var data = angular.fromJson(response);
                    for (var g = 0; g < data.player.length; g++) {
                        var player = model.findPlayerByName(data.player[g].name);
                        if (player == null) {
                            var newPlayer = {
                                _id: (new Date).getTime(),
                                name: data.player[g].name,
                                position: data.player[g].position,
                            };
                            model.players.push(newPlayer);
                        }
                    }
                    deferred.resolve(model.players);
                });
            return deferred.promise;
        }

我觉得应该是:

function fetchPlayers(callback) {
    return $http.get(URL)
        .then(function (response) {
            var data = angular.fromJson(response.data);
            for (var g = 0; g < data.player.length; g++) {
                var player = model.findPlayerByName(data.player[g].name);
                if (player == null) {
                    var newPlayer = {
                        _id: (new Date).getTime(),
                        name: data.player[g].name,
                        position: data.player[g].position,
                    };
                    model.players.push(newPlayer);
                }
            }
            return model.players;
        });
}

基本上,

  • 将所有 promise.success(callback) 更改为 promise.then(callback)
  • return 直接承诺,而不是创建一个额外的延迟对象,该对象在第一个承诺解决时得到解决。
  • (注意)callback 的 return 值被转发到链中的下一个承诺。

另一个答案很接近,但是 .then 方法用响应对象而不是数据回调。

function fetchPlayers() {
    return $http.get(URL)
        .then(function onFulfilled(response) {
            //DO This
            var data = angular.fromJson(response.data);
            //NOT This
            //var data = angular.fromJson(response);
            
            for (var g = 0; g < data.player.length; g++) {
                var player = model.findPlayerByName(data.player[g].name);
                if (player == null) {
                    var newPlayer = {
                        _id: (new Date).getTime(),
                        name: data.player[g].name,
                        position: data.player[g].position,
                    };
                    model.players.push(newPlayer);
                }
            }
            return model.players;
        });
}

来自文档:

The response object has these properties:

  • data – {string|Object} – The response body transformed with the transform functions.
  • status – {number} – HTTP status code of the response.
  • headers – {function([headerName])} – Header getter function.
  • config – {Object} – The configuration object that was used to generate the request.
  • statusText – {string} – HTTP status text of the response.

-- AngularJS $http Service API Reference -- General Usage