JavaScript函数同步执行

时间:2015-04-02 11:10:33

标签: javascript jquery html

1  var abc;
2    <script>   
3   function fn()
4    {

5      abc = dataResponse.getValue("list");

6      }

7    document.getElementById("id1").innerHtml=abc;

    这里列表包含执行java代码后收到的html代码现在我想将值放在div标签内,但由于执行javascript是异步的,我得到abc值undefined并在第7行分配。我需要完成fn()的执行那么值应该被分配到第7行。并且两者都应该在页面加载时完成。它应该适用于我使用while循环完成的所有浏览器: - 而(I&LT; 10)     {

i++;
if(abc)
{
    document.getElementById("para").innerHTML=abc;
    break;
}else{
    fn();
    }

它适用于mozilla和IE但不适用于chrome,这也不是很好的做法。如何解决这个问题?

这是我从java

收到的代码
<ul class="hello" id="hello" >
       <li><a href="#">India</a>
           <ul >
                <li ><a href="#"> States</a></li>
                    <li><a href="#">WB</a>
                    <ul >
                        <li ><a href="#">Kolkata</a></li>
                        <li><a href="#">Silliguri</a></li>
                        <li><a href="#">Kolkata</a>
                            <ul>
                                <li><a href="#">Park Street</a>
                                    <ul>
                                        <li><a href="#">BMW Showroom</a></li>                                       
                                        <li><a href="#">City center</a>
                                            <ul>
                                                <li><a href="#">KFC</a></li>
                                                <li><a href="#">pizzaHut</a></li>
                                            </ul>
                                        </li>
                                    </ul>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </li>
            </ul>
        </li>

2 个答案:

答案 0 :(得分:0)

由于您的dataResponse.getValue函数是异步的,因此您需要转换fn函数,以便在值解析后返回承诺。

function fn()
   {
      var defer = $.Deferred();
      abc = dataResponse.getValue("list");
      var timer = setInterval(function() {
          if(abc) {
            clearInterval(timer);
            defer.resolve(abc);
          }
      }, 100);
      return defer.promise();

  }

现在,

fn().then(function(abc) {
    $("#id1").html(abc);
})

答案 1 :(得分:0)

正在运行的JSBin在这里使用带有Deferred的jQuery timeout对象来模拟异步调用。

http://jsbin.com/lirobuhizu/1/edit