【问题标题】:Promise's chaining, is there any better way?Promise 的链式,有没有更好的办法?
【发布时间】:2018-02-01 10:19:38
【问题描述】:

我已经演示了 Promise 链,其中 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>

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

【问题讨论】:

  • 如果没有错误并且您只想进行代码审查,最好在codereview.stackexchange.com询问
  • p1,p2,p3 has to be resolved synchronously - 同步还是串行?前者不可能,后者是
  • JavaScript 本身有其局限性。 TypeScript 提供异步/等待功能,允许您以同步方式编写异步调用。但是使用它会迫使您以任何方式设置构建管道。所以,也许不是你想要的。

标签: javascript angularjs asynchronous promise


【解决方案1】:

promise 的 p1,p2,p3 必须同步解决

这些承诺不会同步解决,也不会连续解决(如果你是这个意思)。

promise 不控制异步操作,它只是表示结果。所以通过这样做:

var p1 = demoService.get1000();
var p3 = demoService.get3000(); 
var p2 = demoService.get2000();

...您已经已经开始这些操作,这些操作将并行运行(尽管在您的情况下,它们都只是在主线程上安排计时器回调,它们将被序列化一个线程的争用)。

如果你想做一件事,等待它完成,然后再做下一件(例如,按顺序进行,也就是按顺序进行),你就建立了一个链条:

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 可用于第三个回调。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多