javascript - Angularjs,Promise 写得不好

标签 javascript angularjs

我有这个html代码

<body ng-app="myModule">
    <div ng-controller="myController">{{text}}</div>
</body>

还有这个js代码

var myModule = angular.module('myModule', []);

myModule.controller('myController', ['$scope', 'Database', function($scope, Database) {
    Database.first()
        .then($scope.text = 'first')
        .then(Database.second())
        .then($scope.text = 'second')
        .then(Database.third())
        .then($scope.text = 'third');
}]);

myModule.factory('Database', ['$window', '$q', function($window, $q) {
    return {
        first: function() {
            var deferred = $q.defer();
            setTimeout(function() {deferred.resolve();alert('ei')},4000);
            return deferred.promise;
        },
        second: function() {
            var deferred = $q.defer();
            setTimeout(function() {deferred.resolve()},4000);
            return deferred.promise;
        },
        third: function() {
            var deferred = $q.defer();
            setTimeout(function() {deferred.resolve()},4000);
            return deferred.promise;
        },
    }
}]);

(在这里找到http://jsfiddle.net/C5gJr/44/)

然后我想知道为什么 deferred 没有等到我问的时间就解决了。我使用此结构是为了不在另一个函数完成之前启动一个函数,并且它的工作方式如下(此处使用 setTimeout)。

另一个(次要)问题

        .then($scope.text = 'first')
        .then(Database.second())

为什么当我只是填充一个变量时,.then 函数仍然有效?

提前致谢:)

杰拉德

最佳答案

你的错误是你使用了then错误。应该是:

Database.first()
.then(function() {
    $scope.text = 'first';
})
.then(function() {
    return Database.second();
})
.then(function() {
    $scope.text = 'second'
})
.then(function() {
    return Database.third()
})
.then(function() {
    $scope.text = 'third'
});

演示:http://plnkr.co/edit/NGYPiLdUGBzzvVHFFBWy?p=preview

再来一次。这个

.then($scope.text = 'first')

不正确。 then 希望您在其中传递一个函数。所以应该是:

.then(function() {
    $scope.text = 'first'
})

关于javascript - Angularjs,Promise 写得不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21731378/

相关文章:

javascript - 如何在 Highcharts 中悬停时获取列类别名称

javascript - 使用 Javascript 在 localStorage 中存储大型整数数组的最有效方法

javascript - 使用 Angular 2 CLI,如何使用绝对路径,这样我就不必使用 import { .. } from '../../../shared/thing'

javascript - AngularJS 中 jQuery 的 blur 事件的替代品是什么?

angularjs - 如何在 AngularJS 中显示错误消息?

javascript if语句问题

javascript - 这会导致 Rails 检测到 CSRF 吗?

javascript - 如何删除基于 svg 的饼图字符切片之间的空间?

javascript - 元素的内容必须包含格式良好的标记

javascript - ng-click 上的 Angularjs 错误 : Args is null