javascript - Angular $q 然后 hell

标签 javascript angularjs asynchronous angular-promise

在 Angular 的 Q 实现中,我们怎样才能使这种调用看起来更好?这样的话,d3加载和数据加载没有关系,肯定是并行的。

 d3Q.init()
    .then(function(d3) {
        scope.loadHistoryData()
            .then(function(data) {
                scope.renderHistoryGram(target, data, d3);
            });
    });

这种臭代码也很难测试,因为有多个 promise 需要 mock。代码测试有什么最佳实践吗?

最佳答案

由于第二个 promise 似乎并不依赖于第一个 promise ,因此您可以并行运行它们并在两者都使用完 $q.all() 后调用一个函数。 .

$q.all({d3: d3Q.init(), data: scope.loadHistoryData()})
    .then(function(result) {
        scope.renderHistoryGram(target, result.d3, result.data);
    });

在上面的例子中,我们创建了一个对象,这样我们就可以使用键来引用每个 promise 的结果。您还可以传递一系列 promise 。在数组的情况下(如下),结果将是一个结果数组,其顺序与 promise 相同。

$q.all([d3Q.init(), scope.loadHistoryData()])
    .then(function(result) {
        scope.renderHistoryGram(target, result[0], result[1]);
    });

关于javascript - Angular $q 然后 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26245697/

相关文章:

javascript - 如何防止我的登录模式在提交时刷新我的网站?

javascript - 如何在 Rails 出价中实现卖家可以在 24 小时内取消或接受或交易被取消的出价?

javascript - 使用 ui-router - 有没有办法提供 Controller 文件的路径?

javascript - 如何在面积图中组合 2 个系列 - Highchart

javascript - 带有回调和简化错误处理的 Coffeescript

javascript - 如何使用参数创建对象的属性,而不必使每个属性相等

javascript - 有没有一个工具可以扫描我的所有文件并删除 "trailing commas"的 JavaScript?

javascript - 无法获取 View 中的对象属性

c# - 任务继续未安排在线程池线程上

mysql - 异步调用, promise 待处理