Javascript 迭代数组的JS回调不';行不通

Javascript 迭代数组的JS回调不';行不通,javascript,callback,Javascript,Callback,我对这个JS脚本有问题,因为好的Async老先生不喜欢我 尽管tocsv函数假定使用csvdata等待回调,但csv是在回调之前创建的,我得到一个空文件 我非常感谢你帮助我理解如何解决这个问题 tocsv(站点,创建csv); //ITEREATE OVER FILE SITES.JS 函数tocsv(URL、回调){ 对于(变量i=0;i

我对这个JS脚本有问题,因为好的Async老先生不喜欢我

尽管tocsv函数假定使用csvdata等待回调,但csv是在回调之前创建的,我得到一个空文件

我非常感谢你帮助我理解如何解决这个问题

tocsv(站点,创建csv);
//ITEREATE OVER FILE SITES.JS
函数tocsv(URL、回调){
对于(变量i=0;i<3;i++){
var theurl=url[i];
getData(URL、函数(页面标题){
csvdata.push([页面标题]);
});
};
回调(csvdata);
};
//从url获取标题
函数getData(url,回调){
csvdata=[];
$.get(url、函数(数据){
$(“标题”,数据)。每个(函数(){
页面标题=$(this.text();
});
回调(页面标题);
});
};
函数createcsv(thedata){
var数据=数据;
控制台日志(数据);
var csvContent=“数据:文本/csv;字符集=utf-8,”;
forEach(函数(infoArray,index){
dataString=infoArray.join(“,”);
csvContent+=索引
试试这个

var csvdata = [];
tocsv(sites, createcsv);

// ITEREATE OVER FILE SITES.JS
function tocsv(urls, callback) {
    var count = 0
    for (var i = 0; i < 3; i++) {
        var theurl = urls[i];

        getData(theurl, function(the_page_title) {
            count++;
            csvdata.push([the_page_title]);
            if(count == 3) {
                callback(csvdata);
            }
        });
    };
};

// Get title from url
function getData(url, callback) {

    $.get(url, function(data) {

        $("title", data).each(function() {

            the_page_title = $(this).text();
        });

        callback(the_page_title);
    });
};

function createcsv(thedata) {
    var data = thedata;
    console.log(data);
    var csvContent = "data:text/csv;charset=utf-8,";
    data.forEach(function(infoArray, index) {

        dataString = infoArray.join(",");
        csvContent += index < data.length ? dataString + "\n" : dataString;

    });

    var encodedUri = encodeURI(csvContent);
    var link = document.createElement("a");
    link.setAttribute("href", encodedUri);
    link.setAttribute("download", "my_data.csv");
    document.body.appendChild(link); // Required for FF

    link.click(); // This will download the data file named "my_data.csv".  
}
var csvdata=[];
tocsv(站点、创建CSV);
//ITEREATE OVER FILE SITES.JS
函数tocsv(URL、回调){
变量计数=0
对于(变量i=0;i<3;i++){
var theurl=url[i];
getData(URL、函数(页面标题){
计数++;
csvdata.push([页面标题]);
如果(计数=3){
回调(csvdata);
}
});
};
};
//从url获取标题
函数getData(url,回调){
$.get(url、函数(数据){
$(“标题”,数据)。每个(函数(){
页面标题=$(this.text();
});
回调(页面标题);
});
};
函数createcsv(thedata){
var数据=数据;
控制台日志(数据);
var csvContent=“数据:文本/csv;字符集=utf-8,”;
forEach(函数(infoArray,index){
dataString=infoArray.join(“,”);
csvContent+=索引
$。get
是异步的。您的
tocsv
函数不能直接调用带有数据的
callback
,因为
tocsv
在数据可用之前返回。
csvdata.push([页面标题])
您真的打算将数组推入
csvdata
数组吗?不仅仅是一个条目?您的代码在多个地方都受到攻击。一定要在尽可能狭窄的范围内声明变量。这就是我添加callback@T.J.Crowder是的,稍后我将向csv添加更多参数