Javascript 单击“重新加载”按钮后未调用AngularJS-then()方法

Javascript 单击“重新加载”按钮后未调用AngularJS-then()方法,javascript,ajax,angularjs,rest,Javascript,Ajax,Angularjs,Rest,由于AJAX的异步特性,我以前遇到过变量未定义的问题。我已经解决了这个问题,但是,现在我有了一个新的问题。我有以下代码: $scope.cities = [ {name: 'Phoenix,US'}, {name: 'Atlanta,US'}, {name: 'Honolulu,US'} ]; $scope.items = []; $scope.reload = function() { alert("Reload clicked"); var pr

由于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(函数(数据))
在单击我的重新加载按钮后没有被调用;它只在初始页面加载时被调用,即使调用了
$scope.reload
(通过我的警报语句测试)


有人能告诉我我做错了什么吗?

不确定这是否会产生影响,但你真的不需要在循环中手动创建新的承诺$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);
});

您必须将
then()
函数放入
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;
    });
};
工作小提琴
我为你做的就是让你看

我移动了这个代码:

$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;
    });
};

你确定ajax请求成功了吗?是的(我刚刚测试了它,里面有一条alert语句)。为了确保这一点,请尝试在
调用中添加第二个参数,然后使用错误回调来拒绝延迟的on错误。在解决每个延迟的问题时,还要添加一些日志,确保看到每个城市的天气信息。那么,我该怎么做呢?我是AngularJS的新手,你能帮忙吗?你已经“成功”被提醒了-你看到三次了吗?