javascript - 在绘制 d3 图表之前检查多个异步函数是否已完成

标签 javascript asynchronous d3.js

上下文:我正在尝试查询 CrisisNET API多次,以查找一段时间内每天提交的报告数量。

问题:在使用总计数组绘制 d3 图表之前如何检查所有异步函数是否已完成?

代码:

var format = d3.time.format.iso,
    min = format.parse('2014-06-01'),
    max = format.parse('2014-07-01'),
    range = d3.time.day.utc.range(min, max);

totals = [];

for (var i = 0; i < range.length - 1; i++) {

    var request = (function(before, after) {

        var url = 'http://api.crisis.net/item?'
            + '&before=' + format(before)
            + '&after=' + format(after)
            + '&placeName=Syria'
            + '&limit=0'
            + '&apikey=[apikey]';

        d3.json(url, function(error, data) {

            var total =  {

                'date': after,
                'total': data.total

            };

            totals.push(total);
        });
    }(range[i + 1], range[i]));
}

预先感谢您的帮助。我是 JavaScript 的新手,并且仍在尝试理解回调、异步函数等。

最佳答案

如果您知道预期完成多少个函数,并且每个函数都有回调,则可以使用包装函数对它们进行计数,并在它们全部执行后执行其他操作。像这样的事情:

function asyncCounter(numCalls, callback){
    this.callback = callback;
    this.numCalls = numCalls;
    this.calls = 0;
};

asyncCounter.prototype.increment = function(){
    if(this.calls++ === this.numCalls){
        this.callback();
    }
};

然后,您创建一个 asyncCounter 对象,并在每次读取 JSON 时递增它:

var myAsyncCounter = new asyncCounter(numCallsExpected, callback);

...//code outside the JSON calls
d3.json(url, function(error, data) {
    ... //code you want to execute before incrementing the counter
    myAsyncCounter.increment();
}

callback 将在 d3.json 调用中的所有代码完成后执行。

关于javascript - 在绘制 d3 图表之前检查多个异步函数是否已完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24872260/

相关文章:

python - 将大字典提供给异步函数会使代码非常慢

java - CompletableFuture runAsync内部的单元测试代码

javascript - 通过 playframework 将动态创建的数据传递给 d3

javascript - d3.js 在 path.line 中给出 NAN

javascript - 尝试在 reactjs 中呈现时出现 webpack 问题

javascript 无法识别 1 var >= another

jquery - jquery的$.get是异步的吗?

javascript - D3.js 中的 selection.style 和 selection.attr 有什么区别?

javascript - Map.forEach,为什么删除循环中的项目有效?

javascript - 文件名中 $Revision$ 的 IE6 Javascript 问题