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小提琴更新
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在快速服务中引用上下文,则它不会是服务实例.
| 归档时间: |
|
| 查看次数: |
489 次 |
| 最近记录: |