javascript - angularjs 延迟 promise 不延迟

标签 javascript angularjs promise deferred angular-promise

努力让 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

fastServiceslowService 之前开始完成,尽管在 Service_1 中使用了延迟对象/ promise 和一个 .then在 Controller 中...

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

jsfiddle 是 here

编辑: 将快速功能放入服务中,这样就不会与提升等混淆 - 仍然是相同的结果 - js fiddle 已更新

最佳答案

The fastService is starting before the slowService completes

那是因为您在 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 上下文,它不会是服务实例.

关于javascript - angularjs 延迟 promise 不延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27868388/

相关文章:

javascript - 如何在 jquery 循环中更改寻呼机文本

javascript - 为什么在使用 ng-options 时我不能在 select 中有多个 ng-if 选项

javascript - Angular 意外行为。自执行函数调用作用域函数

javascript - 需要帮助将回调转换为 Promise

javascript - 单击缩略图时使用 JavaScript 更改大图像

javascript - Angularjs UI-Router 状态参数不工作

javascript - ng-model 没有在 safari 浏览器中的命令粘贴上更新

javascript - Python 请求句柄 url 包含回调

javascript - deferred.fail()后如何继续执行JS

javascript - 默认 jQuery 别名 ($) 背后的原因