努力获得 promise 在angularjs服务提供商中正常运行
我读过docs以及许多示例(hereherehere),我认为我的语法还可以
(尽管显然有些问题)

应用模块和 Controller 看起来像

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

myApp.controller('Controller_1', ['$scope', 'Service_1', function($scope, Service_1) {

    var myName = "Ben";

    Service_1.slowService(myName)
        .then(Service_1.fastService(name));

    $scope.myName = myName;
}]);

该服务(具有慢速功能)如下所示:
myApp.service('Service_1', function($q) {
    this.slowService = function (name) {
        var deferred = $q.defer();
        console.log('Start of slowService:', name, Date.now());

        setTimeout(function() {
            console.log('setTimeout name:', name, Date.now());

            if(name){
                name = 'Hello, ' + name + " is learning Angularjs";
                alert(name);
                    console.log('name:', name);
                deferred.resolve(name);
            } else {
                deferred.reject('No name supplied !');
            }
        }, 3000);

        return deferred.promise;
    };

    this.fastService = function(name){
        console.log('Start of fastFunction:', name, Date.now());
        alert('Hello ' + name + ' - you are quick!');
    };
});

控制台输出如下所示:
Start of slowService: Ben 1420832940118
Start of fastFunction: result 1420832940122
setTimeout name: Ben 1420832948422
name: Hello, Ben is learning Angularjs

尽管在fastService中使用了延迟的对象/ promise 以及在 Controller 中使用了slowService,但Service_1.then完成之前就开始了...

谁能指出代码有什么问题吗?

jsfiddle是here

编辑:将快速功能添加到服务中,因此与吊装等没有混淆-仍然相同的结果-js小提琴更新了

最佳答案



那是因为您要在运行slowService异步回调之前执行fastService函数,而需要提供该函数的引用。即.then(Service_1.fastService(name));应该是.then(Service_1.fastService);.then(function(name){ Service_1.fastService(name); });,否则fastservice会立即运行,在slowService的异步部分运行之前。

使用$timeout的好处是它已经返回了promise,因此您无需创建延迟的对象并生成deferred anti-pattern

myApp.service('Service_1', function($q, $timeout) { //<-- Inject timeout
    this.slowService = function (name) {
        console.log('Start of slowService:', name, Date.now());

        return $timeout(function() {
            console.log('setTimeout name:', name, Date.now());

            if(name){
                name = 'Hello, ' + name + " is learning Angularjs";
                return name; //return data
           }
           //Reject the promise
           return $q.reject('No name supplied !');

        }, 3000);


    };
   //...
});

并通过以下方式消费时:
  Service_1.slowService(myName)
     .then(Service_1.fastService);

因此,即使您在原始方法中使用$http,也无需超时,只需从http返回promise,而不创建延迟的对象即可。同样,请记住在使用语法.then(Service_1.fastService);时,如果要在快速服务中引用this上下文,它将不会成为服务实例。

09-19 05:11