除非调用alert(),否则不设置异步回调中设置的值?

时间:2014-09-15 01:55:42

标签: javascript html asynchronous d3.js

HTML div

<div id="viz"></div>

的javascript

<script type="text/javascript">
var gg=document.getElementById("viz");

function ex(nn) {
    var zzz;

    d3.xml("./xyzfiles/svgs/s"+nn+".svg", "image/svg+xml", function(xml) {
        zzz=xml.documentElement;
    });

    if(q==null) {
        alert("no child");
    } else {
        alert("has child");
    }

    gg.appendChild(zzz);
}

ex(1);    
ex(6);
</script>   

我有svg文件s1.svg,s2.svg ....当我使用alert()函数时加载但当我删除时如下

<script type="text/javascript">
var gg=document.getElementById("viz");

function ex(nn) {
    var zzz;

    d3.xml("./xyzfiles/svgs/s"+nn+".svg", "image/svg+xml", function(xml) {
        zzz=xml.documentElement;
    });

    gg.appendChild(zzz);
}

ex(1);    
ex(6);
</script>   

ex(1),ex(6)没有被执行。为什么它发生了sir并且有没有任何静默方式刷新DOM以便ex()可以在没有alert()的情况下执行。

1 个答案:

答案 0 :(得分:1)

您在zzz来电之前附加d3.xml。你需要在回调中做到这一点。警报导致浏览器停止,因此异步调用在追加时已完成。使用console.log代替alert会提供线索。

顺便问一下,q应该是什么?

关于这个话题,有很多关于SO的问题。请参阅How do I return the response from an asynchronous call?Variables set during $.getJSON function only accessible within functionWhy is my variable unaltered after I modify it inside of a function? - Asynchronous code referenceGet data from fs.readFile