调试并行运行的 Promise 的最佳方法

Posted

技术标签:

【中文标题】调试并行运行的 Promise 的最佳方法【英文标题】:Best way to debug promises running in parallel 【发布时间】:2015-09-21 02:58:03 【问题描述】:

我正在使用 nodejs+express 开发应用程序的后端,并使用 RSVP 进行承诺。

问题:只要其中一个功能出现意外错误或异常,执行就会卡住。有什么办法可以找到哪个函数有错误。

代码如下所示:

    function checkifvalid_call() 
        return new RSVP.Promise(function(fulfil, reject) 
            common.checkifvalid(test, function(isValid) 
                if (isValid === false) 
                    logger.fatal("Not valid test....sending invalid result")
                    res.send(
                        "Error": "Invalid test"
                    );
                
            );
        );
    


    function secondtest_call() 
        return new RSVP.Promise(function(fulfil, reject) 
            common.secondtest(test, function(isValid) 
                if (isValid === false) 
                    logger.fatal("Not valid second test....sending invalid result")
                    res.send(
                        "Error": "Invalid second test"
                    );
                
            );
        );
    

    RSVP.allSettled([checkifvalid_call(), secondtest_call()]).then(function(ret_array) 
        console.log("Calls finished");
        logger.debug("sending result..............")
        res.send("success);
    ).catch(function(reason) 
        logger.debug("Exception encountered : " + reason);
    ).finally(function() 
        logger.debug("All done finally")
    );

    RSVP.on('error', function(reason) 
        console.assert(false, reason);
    );

谢谢。

【问题讨论】:

呃,那里发生了什么或者是否有意外的异常似乎并不重要 - 你的承诺总是卡住了?你永远不会解决或拒绝他们! 如果那些common 方法是异步的,为什么它们不返回承诺? 谢谢 Bergi... 我错过了导致 Web 服务调用永不返回的方法之一中的拒绝/履行。但我仍然怀疑,如果某个特定函数的返回时间过长,可能是因为长时间运行的数据库查询,那么我如何知道传递给 RSVP 的所有函数中的哪个函数导致了延迟。检查这个的最优雅的方法是什么? 你可以给他们每个人一个超时时间,当它没有满足时报告 【参考方案1】:

尝试使用trycatch,并在每个承诺而不是整个事情上使用 RSVP 的错误处理程序。当前的处理程序集仅检查 'allSettled' 是否有错误 afaik。

这篇博文很好地解释了 Promise:

How To Use Promises

【讨论】:

以上是关于调试并行运行的 Promise 的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

Promise.all 同时或并行运行 [重复]

如何在node.js中正确调试简单的Prom?

如何判断我的 promise.all 是不是并行运行?

从并行运行脚本更新值的最佳方法 - Python

Promise.all() 允许失败的替代方案? [复制]

使用 APScheduler 在 python 中进行并行编程的最佳方法是啥?