繁体   English   中英

AngularJS-单击重载按钮后未调用then()方法

[英]AngularJS - then() method not being called after reload button click

由于AJAX的异步特性,我以前有一个变量未定义的问题。 我已经解决了该问题,但是现在有了一个新问题。 我有以下代码:

$scope.cities = [
    {name: 'Phoenix,US'},
    {name: 'Atlanta,US'},
    {name: 'Honolulu,US'}
];

$scope.items = [];
$scope.reload = function() {

    alert("Reload clicked");

    var promises = [];

    angular.forEach($scope.cities, function(city) {
        var deferred = $q.defer();
        delete $http.defaults.headers.common['X-Requested-With'];
        $http.get('http://api.openweathermap.org/data/2.5/weather?q=' + city.name).success(function(data, status, headers, config) {
            alert("success");
            deferred.resolve(data);

        });
        promises.push(deferred.promise);
    });

    return $q.all(promises);
};

//not being called after reload button is clicked
$scope.reload().then(function(data) {
    $scope.name0 = data[0].name;
    alert($scope.name0);
);

我的$scope.reload在初始页面加载以及单击我的重新加载按钮时都会被调用。 但是,单击我的重载按钮后,没有调用scope.reload().then(function(data)) 即使$scope.reload确实被调用(与我的警报语句测试一样),它也只会在初始页面加载时被调用。

有人可以告诉我我在做什么错吗?

您必须将then()函数放入reload()函数中。

工作提琴
我为您制作了一个工作提琴以向您展示。

我移动了这段代码:

$q.all(promises).then(function(data) {
    $scope.answer = data;
});

并将其放入您的reload函数中。

$scope.reload = function () {
    var promises = [];
    angular.forEach($scope.cities, function (city) {
        var deferred = $q.defer();
        delete $http.defaults.headers.common['X-Requested-With'];
        $http.get('http://api.openweathermap.org/data/2.5/weather?q=' + city.name).success(function (data, status, headers, config) {
            deferred.resolve(data);
        });
        promises.push(deferred.promise);
    });

    // This block here:
    $q.all(promises).then(function(data) {
        $scope.answer = data;
    });
};

不确定是否会有所作为,但您实际上并不需要在循环内手动创建新的Promise。 $ http已经返回一个可以使用的承诺:

var promises = [];

angular.forEach($scope.cities, function(city) {
    delete $http.defaults.headers.common['X-Requested-With'];
    var promise = $http.get('http://api.openweathermap.org/data/2.5/weather?q=' + city.name);
    promise.success(function(data, status, headers, config) {
        alert("success");

    });
    promises.push(promise);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM