【问题标题】:Running and getting sequentially progress from Q Promise从 Q Promise 运行并获得顺序进展
【发布时间】:2015-10-21 00:09:31
【问题描述】:

我有这段代码,我希望这两个 Promise 顺序运行,结果应该是这样的:

a progress: 20
a progress: 40
a progress: 60
a progress: 80
a progress: 100
a resolve: a

b progress: 20
b progress: 40
b progress: 60
b progress: 80
b progress: 100
b resolve: b

但我明白了:

a progress: 20
b progress: undefined
a progress: 40
b progress: undefined
a progress: 60
b progress: undefined
a progress: 80
b progress: undefined
a progress: 100
a resolve: a
b progress: undefined
b progress: 20
b progress: 40
b progress: 60
b progress: 80
b progress: 100
b resolve: b

这是我的全部代码:

var a =  function(){
        return q.Promise(function(resolve, reject, notify){
            var percentage = 0;
            var interval = setInterval(function() {
                percentage += 20;
                notify(percentage);
                if (percentage === 100) {
                    resolve("a");
                    clearInterval(interval);
                }
            }, 500);
        });
    };

    var b =  function(){
        return q.Promise(function(resolve, reject, notify){
            var percentage = 0;
            var interval = setInterval(function() {
                percentage += 20;
                notify(percentage);
                if (percentage === 100) {
                    resolve("b");
                    clearInterval(interval);
                }
            }, 500);
        });
    };


    a().then(function(res) {
            console.log('a resolve: '+res);
            return b();
        },
        errorHandler,
        function(progress){
            console.log('a progress: '+progress);
        })

        //call b()
        .then(function(res){
            console.log('b resolve: '+res);
        },
        errorHandler,
        function(progress){
            console.log('b progress: '+progress);
        });

    function errorHandler(err) {
        console.log('Error Handler:', err);
    }

【问题讨论】:

    标签: javascript node.js promise q


    【解决方案1】:

    您可以使用Q's chaining

    a()
    .then(
        function(res) {
            b().then(function(resb) {
                console.log('b resolve: '+resb);
            },
            errorHandler,
            function(progress){
                console.log('b progress: '+progress);
            });
        },
        errorHandler,
        function(progress){
            console.log('a progress: '+progress);
        });
    

    使用fin 也可以:

    a()
    .then(
        function(res) {
            console.log('a resolve: '+res);
        },
        errorHandler,
        function(progress){
            console.log('a progress: '+progress);
        })
    .fin(function() {
        b().then(function(res) {
            console.log('b resolve: '+res);
        },
        errorHandler,
        function(progress){
            console.log('b progress: '+progress);
        });
    });
    

    我们看一下原始代码的流程:

    a().then(function(res) {
            console.log('a resolve: '+res);
            return b(); // (0) here we only create promise for 'b'
        },
        errorHandler,
        function(progress){
            console.log('a progress: '+progress); // (1) here Q calls progress's callback
        })
    
        //call b()
        .then(function(res){
            console.log('b resolve: '+res); // (2) it's called in the end
        },
        errorHandler,
        function(progress){
            console.log('b progress: '+progress);  // (1) and here Q calls progress's callback
        });
    

    'b progress: undefined' 是因为完全没有进度,但是调用了回调。在未完成承诺时调用进度回调。当您返回某些东西或调用“解决”时,承诺就会得到履行。

    【讨论】:

    • 我使用的方式是不是链式的?根据文档,它是!您只是因为 return b() ,将所有代码嵌套在 a 的 then 部分中。但为什么?我不使用嵌套。就像回调金字塔
    • 文档说“您可以在处理程序内部或外部链接承诺”。我想在外面使用一个平面代码。它说这两个是等价的,但为什么这不起作用?你的代码在 handler 里面,我的代码在外面,但是你的工作,不是我的
    • 我正在考虑解释。
    • 实际上我的代码适用于解析部分,我的意思是解析是顺序的,但只有进度部分像并行一样运行
    • @Fcoder:进度通知已被弃用,因为它不遵循这些语义。如果链接,事件将通过所有处理程序冒泡,因此如果要单独处理它们,则需要嵌套。
    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 2013-09-26
    • 2016-02-17
    相关资源
    最近更新 更多