【问题标题】:AngularJS : promise chain not deferring past 2nd functionAngularJS:承诺链不推迟第二个功能
【发布时间】:2015-03-08 13:51:35
【问题描述】:

作为扩展名of a question I asked earlier(感谢所有帮助!),
我无法让我的第二个返回的承诺工作(在 3 个或更多的链中)
我已经查看了thisthis,但找不到任何关于我当前代码的线索

应用和控制器看起来像:

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

    var myName = "Ben";

    myService.slowService(myName)
    .then(function(result){myService.slowService2(result);})
    .then(function(result){myService.fastService(result);});

    $scope.myName = myName;
});

服务提供者如下:

myApp.service('myService', function($q, $timeout) {

    this.slowService = function (name) {
        var deferred = $q.defer();
        console.log('Start of slowService1:', name, Date.now());

        $timeout(function() {
            name = 'Hello, ' + name + " is learning Angularjs";
            alert(name); 
            deferred.resolve(name);
                console.log('End of slowService1 timeout:', name, Date.now());
        }, 1500);

        return deferred.promise;
    };

    this.slowService2 = function (name) {
        var deferred = $q.defer();
        console.log('Start of slowService2:', name, Date.now());

        $timeout(function() {
            name = 'Hello, ' + name + " is learning Angularjs";
            alert(name); 
            deferred.resolve(name);
                console.log('End of slowService2 timeout:', name, Date.now());
        }, 1000);

        return deferred.promise;
    };

    this.fastService = function(name){ 
        var deferred = $q.defer();
            console.log('Start of fastService:', name, Date.now());
        alert('Hello ' + name + ' - you are quick!'); 
        deferred.resolve();
            console.log('End of fastService:', name, Date.now());
        return deferred.promise;
    };
});

控制台输出如下:

Start of slowService1: Ben 1420877247858
End of slowService1 timeout: Hello, Ben is learning Angularjs 1420877250982
Start of slowService2: Hello, Ben is learning Angularjs 1420877250983
Start of fastService: undefined 1420877250984
End of fastService: undefined 1420877251641
End of slowService2 timeout: Hello, Hello, Ben is learning Angularjs is learning Angularjs 1420877254148

因此,虽然第一个 slowService1 $q.defer() 有效,但第三个函数 fastService 不会在开始之前等待第二个 slowService2 延迟对象解析...?

jsfiddle 是here

PS $timeout 仅用于模拟 $http 调用和 SQLite 查询等。

【问题讨论】:

    标签: javascript angularjs promise deferred angular-promise


    【解决方案1】:

    您需要return 承诺,以便您可以与.then 链接:

    myService.slowService(myName)
        .then(function(result){
            return myService.slowService2(result);
         })
        .then(function(result){
            myService.fastService(result);
         });
    

    【讨论】:

    • 说真的,你们是最棒的!
    • 感谢您的补充,但 SO 习惯上赞成并接受最有帮助的答案
    • 肯定是在等待 15 分钟,然后将解决方案应用到我的代码中分心 :-) 完成。 ...当我们在这里时,您能告诉我服务功能中.then 中的returnreturn deferred.promise; 之间的区别吗?我以为我已经在 with 延迟对象返回了承诺?
    • 但是你必须从 .then 的匿名函数中返回该承诺。
    猜你喜欢
    • 1970-01-01
    • 2015-03-08
    • 2021-02-18
    • 2017-02-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    相关资源
    最近更新 更多