javascript项目中如何将同步的函数平滑切换到异步的函数?

标题看起来确实有些难懂。
由于本人在JS这块编程不是很熟悉,所以我在做项目时候经常遇到这个问题,也困扰了我很久。
关于这个问题,我举个例子吧。
项目中经常有很多地方都使用了同一段代码,为了方便,我喜欢就把它抽出来写成一个函数,比如这个funA(),这个函数功能很简单,就是取某些dom的值,进行加加减减操作,然后返回结果。

function funA(){
    var i = document.getElementById(...).value;
    var j = document.getElementById(...).value;
    return i + j;
}

有了funA(),代码量减少了不少。直到有一天,老板说这个函数要改改,不要去读dom的值了,而是要从服务端拉取。
听起来很简单,但实际开发的时候我懵了。
这是因为:

  1. funA()是同步的,什么时候调用它,它就什么时候返回对应的值。而新的funA()是异步的,调用它之后,鬼知道什么时候返回数据给我。

  2. 无数的代码调用了我的funA()函数,所有调用funA()的代码都认为这个函数能够返回想要的数字,我可不想因为funA()去读服务端,就得改无数个地方。

  3. 还有更多的类似funA()的函数面临这种改动。即原本是同步的函数,某一天非得改成异步的。

请教各位JS大神,你们是怎么解决我这个问题的呢?

阅读 3.8k
3 个回答

要么把你那一堆调用funA的代码写在funA调用完成的方法中,
要么把funA的调用改成同步的,就是jQuery的$ajax中的那个异步属性改成false。

一个函数是没有办法控制你后续代码的执行的。

可以把你需要 解析数据,处理数据的这些方法,都放到一个程序池里 。 当你数据返回的时候,执行一个 回调函数 run,这个回调函数再去 遍历 程序池,就可以了。 比如ajax 的success ==> run 另外,你可以用给run传递的参数来控制 执行哪些方法。传索引就可以了。 比如 索引i到索引j ,不传默认全部遍历。

是这样吗?

function funA(callback){
   
    var i = document.getElementById(...).value;
    var j = document.getElementById(...).value;
    return callback(i + j);
}

// 调用
funA(function(result){
    console.log(result)
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏