【发布时间】:2015-03-08 05:39:47
【问题描述】:
努力让承诺在 angularjs 服务提供商中正常工作 我已经阅读了docs 以及许多示例(here、here 和here),我认为我的语法没问题 (虽然显然出了点问题)
应用模块和控制器看起来像
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 在slowService 完成之前开始,尽管在Service_1 中使用了延迟对象/承诺,在控制器中使用了.then...
谁能指出代码有什么问题?
jsfiddle 是here
编辑:将快速功能放在服务中,这样就不会与提升等混淆 - 仍然是相同的结果 - 更新了 js fiddle
【问题讨论】:
-
setTimout 好像是稍后执行的jsfiddle.net/q4vofnz8/18
-
这里是使用事件jsfiddle.net/q4vofnz8/21的示例
标签: javascript angularjs promise deferred angular-promise