Angularjs,Promises写得不好

时间:2014-02-12 14:56:14

标签: 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/

然后我想知道为什么延迟解决而不等我问的时间。我正在使用这个结构,以便在另一个完成之前不启动它,它就像这个一样工作(这里使用setTimeout)。

另一个(次要)问题

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

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

提前致谢:)

杰拉德

1 个答案:

答案 0 :(得分:3)

您的错误是您使用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'
})