我已经证明了承诺的链接,其中p1,p2,p3必须同步解决。
下面的代码是使用angular.js 1,这里P3被解析然后是P2然后是P1。
代码如下,
<script type="text/javaScript">
angular.module("myApp",[]);
angular.module("myApp").controller("myCtrl",myCtrl);
angular.module("myApp").factory("demoService",demoService);
demoService.$inject = ["$q","$timeout"];
myCtrl.$inject = ["$scope","demoService"];
function myCtrl($scope,demoService){
var vm = this;
vm.init = init;
vm.myList = [];
function init(){
var p1 = demoService.get1000();
var p3 = demoService.get3000();
var p2 = demoService.get2000();
p3.then(function(obj){
console.log(obj.name);
return p2;
}).then(function(obj){
console.log(obj.name);
return p1;
}).then(function(obj){
console.log(obj.name);
});
} // end of init
} // end of myCtrl
function demoService($q,$timeout){
var obj = {};
obj.get1000 = get1000;
obj.get2000 = get2000;
obj.get3000 = get3000;
return obj;
function get1000(){
var deferred = $q.defer();
var INTERVAL = 1000;
$timeout(function() {
deferred.resolve({ "name" : INTERVAL });
}, INTERVAL);
return deferred.promise;
}
function get2000(){
var deferred = $q.defer();
var INTERVAL = 2000;
$timeout(function() {
deferred.resolve({ "name" : INTERVAL });
}, INTERVAL);
return deferred.promise;
}
function get3000(){
var deferred = $q.defer();
var INTERVAL = 3000;
$timeout(function() {
deferred.resolve({ "name" : INTERVAL });
}, INTERVAL);
return deferred.promise;
}
} // end of demoService
</script>
所以,我的问题是,有没有更好的方法进行上述操作? 另请查看我的代码。 感谢。
答案 0 :(得分:2)
其中p1,p2,p3必须同步解决
这些承诺不会同步或连续解决(如果这就是你的意思)。
承诺不会控制异步操作,只需代表结果。通过这样做:
var p1 = demoService.get1000();
var p3 = demoService.get3000();
var p2 = demoService.get2000();
...您已经已经开始这些将并行运行的操作(尽管在您的情况下,因为他们只是在主线程上安排计时器回调,但他们&#39;将通过争用该一个线程来序列化。)
如果你想做一件事,等待它完成,然后做下一件事(例如,连续完成,也就是串行),你建立一个链:
demoService.get1000()
.then(result1 => demoService.get3000())
.then(result2 => demoService.get2000())
.then(result3 => {
// Do something with the result
})
.catch(error => {
// Do something with the error
});
当然,如果你最后想要所有三个结果,你必须以任何一种方式使result1
和result2
可用于第三个回调。