请问 JavaScript 中有没有不需要注入的回调实现方法?

2017-08-12 02:16:00 +08:00
 Plumes

遇到的问题是这样的,有一个函数 func_a :

function func_a() {
  if(something){
    func_b();
  } else {
    func_c();
  }
}

func_a 里面可能执行 func_b , 也可能执行 func_c, 而 func_bfunc_c 在执行结束后还需要执行一些共同的操作,这里就需要对两个函数进行回调 现在能实现需求的方法就是

function func_b(callback) {
  //do something
 callback();
}

function func_a() {
  if(something){
    func_b(func_d);
  } else {
    func_c(func_d);
  }
}

这样的话需要在 func_a 中调用的函数,都需要接受 callback 参数,最后再去调用 callback(),而实际问题中,func_b 这些函数是在外部实现,然后作为参数传入 func_a 的,所以每定义一个都需要加上这两行, 感觉有些冗余。

func_b 这类函数既可能执行的是 console.log() 这些同步操作,也可能执行的是 fetch(api).then().catch() 这样的异步操作。

不知道有没有什么方法使 func_b 不需要接受外部参数,完全在 func_a 内部实现回调,保证在 func_b 执行完成之后去执行某些操作。

1953 次点击
所在节点    JavaScript
8 条回复
Pastsong
2017-08-12 02:19:03 +08:00
Promise.all
binux
2017-08-12 02:28:11 +08:00
Promise.resolve
Chingim
2017-08-12 10:21:45 +08:00
不考虑 async/await 吗?
Plumes
2017-08-12 10:42:15 +08:00
@Pastsong @binux

问题已更新,继续请教
```
Promise.resolve(fun_b()).then(()=>{console.log("second")})
```
输出的还是 second、first
ETiV
2017-08-12 10:54:39 +08:00
不改造 b、c 没办法
无论是啥 promise async 都得按照它的规范来写

如果本来有回调的写法,bluebird 库貌似可以 promisify 它 http://bluebirdjs.com/docs/api/promise.promisify.html

但本来没回调的,不改不行了
yanqing07
2017-08-12 11:28:34 +08:00
fun_b 要改成 Promise 形式啊
binux
2017-08-12 14:27:45 +08:00
没有可能在 func_b 本身不支持的情况下支持回调
will0404
2017-08-12 16:14:46 +08:00
直说吧。不可能。
你必须得知道 func_b 什么时候执行结束,否则没有顺序可言。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/382341

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX