承诺的链接,还有更好的方法吗?

时间:2018-02-01 10:19:39

标签: javascript angularjs asynchronous promise

我已经证明了承诺的链接,其中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>

所以,我的问题是,有没有更好的方法进行上述操作? 另请查看我的代码。 感谢。

1 个答案:

答案 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
    });

当然,如果你最后想要所有三个结果,你必须以任何一种方式使result1result2可用于第三个回调。