想要顺序调用函数 F, 但 F 里存在异步调用, 有什么可能的方案?

比如我有三个函数, 我开始是想要顺序 a, F, b:

x = function
  a()
  F()
  b()
end

但是后来出现需求, F 是一个异步的函数, 但为了方便, 我不打算改 x 的定义.
就是说, 我希望 F() 仍然保持这样的写法, 但是会处理到 F 当中的异步调用..

首先, 这在很多语言里是做不到的...

所以不限制编程语言的话, 是否有方案做到?

阅读 5.7k
5 个回答

JS的话Promise机制可以处理这个情况

var x = function() {
    return Promise.cast(a())
        .then(function() {
            return F();
        }
        .then(function() {
            return b();
        }
}

改造后无论a/F/b都可以是异步/同步过程,无需改动x,同步过程返回结果,异步过程返回thenable对象即可

这正是我之前在博客里评论回复的Promise的重要优点第三项 统一异步和同步过程的调用

x = function*
  a()
  yield F()
  b()
end

将实际上为异步的操作以同步的方式写出来,以下语言支持:

有几种实现的js的话看老赵的Wind.js,Python的话使用yield可以达到可以参考Tornado的gen模块,有个文档说的不错http://www.dabeaz.com/coroutines/index.html ,C#的话新版本的有个await关键字别的语言就不知道了

package main

import "fmt"

func a() {
    fmt.Println("func a()")
}

func b() {
    fmt.Println("func b()")
}

func main() {

    a()
    ch := make(chan int)

    go func() {
        fmt.Println("func f do something")
        <-ch
    }()

    b()
    ch <- 1

    fmt.Println("DONE")
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进