angularjs deferred承诺不推迟

gor*_*rds 2 javascript promise deferred angularjs angular-promise

努力让promise在promjs服务提供商中正常工作我已经阅读了文档以及大量的例子(这里,这里这里),我想我的语法很好(虽然显然有些不对劲)

app模块和控制器看起来像

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;
}]);
Run Code Online (Sandbox Code Playgroud)

服务(具有慢速功能)看起来像这样:

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!'); 
    }; 
});
Run Code Online (Sandbox Code Playgroud)

控制台输出如下所示:

Start of slowService: Ben 1420832940118
Start of fastFunction: result 1420832940122
setTimeout name: Ben 1420832948422
name: Hello, Ben is learning Angularjs
Run Code Online (Sandbox Code Playgroud)

fastService是开始之前slowService完成,尽管使用延迟对象/承诺Service_1.then控制器...

任何人都可以指出代码有什么问题吗?

jsfiddle就在这里

编辑:把快速功能放在服务中,这样就不会出现与提升等混淆 - 仍然是相同的结果 - js小提琴更新

PSL*_*PSL 5

fastService在slowService完成之前启动

那是因为你在slowService异步回调运行之前执行函数fastService.而你想要提供函数的引用.即.then(Service_1.fastService(name));.then(Service_1.fastService);.then(function(name){ Service_1.fastService(name); });以其他方式fastservice将只运行向右走,在slowService的异步部分运行之前.

使用$timeout它的好处是它已经返回一个promise,因此你不需要创建一个延迟对象并导致延迟反模式.

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


    };
   //...
});
Run Code Online (Sandbox Code Playgroud)

当消费只通过链:

  Service_1.slowService(myName)
     .then(Service_1.fastService);
Run Code Online (Sandbox Code Playgroud)

因此,即使您$http在原始方法中使用而不是超时,只需从http返回promise,而不是创建延迟对象.另外,在使用语法时请记住.then(Service_1.fastService);,如果您this在快速服务中引用上下文,则它不会是服务实例.