V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
cheerzeng
V2EX  ›  JavaScript

如何确保两个函数的运行顺序

  •  
  •   cheerzeng · 2017-04-14 19:14:37 +08:00 · 2830 次点击
    这是一个创建于 2788 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好, 不怎么深入 js, 对运行顺序有点疑惑。 意图是: 有三个下拉菜单,二级菜单想通过一级菜单选中的选项去服务器拿数据然后作为选项, 同样三级菜单根据二级菜单的被选中的选项去服务器拿数据作为选项。

    有两个函数, update_data1, 更新二级菜单选项, update_data2, 更新三级菜单选项,

    函数里面差不多是这种形式。

    
    $.get(url, function(data, status){
    	$("#menu").html(data);
    })
    
    

    但是用下面代码执行的时候第二个函数取到的二级菜单被选中的选项还是初始值, 而不是前一个函数处理完的服务器传回来的值。

    
    $(document).ready(function(){
      	update_data1();
      	update_data2();	
    })
    

    是需要对 callback 进行处理吗?查了一下 js 执行顺序,看到好多声明式函数跟赋值式函数的执行顺序,但感觉应该不是这种导致的吧? 求指教, 谢谢。

    8 条回复    2017-04-20 22:35:34 +08:00
    lonelinsky
        1
    lonelinsky  
       2017-04-14 19:40:18 +08:00
    把 update_data1 作为第一个下拉框的 onchange 回调函数,同理 update_data2 作为第二个下拉菜单的 onchange 回调函数
    dingz
        2
    dingz  
       2017-04-14 19:40:22 +08:00 via Android
    promise 串联
    spoonwep
        3
    spoonwep  
       2017-04-14 19:57:29 +08:00 via iPhone
    你需要 propromise 或者 async/await
    cheerzeng
        4
    cheerzeng  
    OP
       2017-04-14 20:03:25 +08:00 via iPhone
    @lonelinsky
    @dingz
    @spoonwep 好的,我试试,谢谢啊!!
    SourceMan
        5
    SourceMan  
       2017-04-14 20:10:37 +08:00 via iPhone
    异步嘛
    cuzfinal
        6
    cuzfinal  
       2017-04-15 08:22:38 +08:00 via Android
    setTimeOut(()=>{update_data2();},0)
    zhangolve
        7
    zhangolve  
       2017-04-20 22:30:39 +08:00
    看楼主的描述和使用 jQuery ,我感觉这个时候其实也没有必要像楼上几位说的,用 promise ,个人理解 promise 在控制多个异步请求并发或者是竞速,也就分别对应 promise.all 和 promise.race 还是很强大的,但是看楼主的描述,感觉既然是用了 jq ,直接再套一层,可能对楼主已经有了 jq 经验,无需学习 promise 更加快,而且同样能达到异步控制。

    把以前写的个小例子改了改,可以看看。

    https://codepen.io/zhangolve/pen/EmKKxB

    可能说的不对,欢迎指出吧。
    zhangolve
        8
    zhangolve  
       2017-04-20 22:35:34 +08:00 via Android
    不过话说回来,我一看都六天前的帖子了,应该也都解决了吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3795 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 106ms · UTC 10:36 · PVG 18:36 · LAX 02:36 · JFK 05:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.