这里 api1 api2 的实现因为须要用 event loop 来注册刊出某些事宜,所以显得特别复杂,这里我们可以先忽视它们的实现,然则看最后一段“用户代码”是不是极其复杂?跟着操作的复杂性增长,回调函数的嵌套会越变越深。如不雅你熟悉Javascript,你应当听过“callback hell”的大年夜名。回调函数的方法为什么不好?最重要的就是它违背了我们写代码的直觉,我们都习惯次序履行的代码。
例如上例中,我们等待的是 api1 先履行,我们再用它的结不雅做点什么,但采取回调的方法,我们就须要在写 api1 的回调时,就去思虑我们想用它的结不雅做些什么操作。在这个例子里,我们须要调用 api2 及 api3 ,这些嵌套的思虑又得一遍遍反复下去。最终代码异常难以懂得。
- class Promise():
- def __init__(self):
- pass
- def then(self, callback_that_return_promise):
- self._then = callback_that_return_promise
- def set_result(self, result):
- return self._then(result)
- # Implementation for api
- def api1():
- promise = Promise()
- def callback_for_api1():
- promise.set_result(some_calculation_1())
- event_loop.unregister_event(event1)
- event_loop.register_event(event1, callback_for_api1)
- return promise
- def api2(result):
- promise = Promise()
- def callback_for_api2():
- promise.set_result((some_calculation_2(result))
- event_loop.unregister_event(event2)
- return callback(result2)
- return promise
- ...
- # Our code
- global result
- promise = api1().then(lambda result1: return api2(result1))
- .then(lambda result2: return api3(result3))
- .then(lambda result3: global result; result = result3)
- promise.wait_till_complete()
然而故事还没有停止,人们依旧不满于 Promise 的写法和用法,又提出了 async/await 的写法。在 Python 中,膳绫擎的代码用 async/await 重写如下:
这里我们简单实现了一个我们本身的 Promise 类,当它的 set_result 办法被调用时,Promise 会去履行之前用 .then 注册的回调函数,该回调函数将履行另一些操作并返回一个新的 Promise。也是以,我们可以赓续地调用 then 将不合的 Promise 组合起来。可以看到,如今我们的代码就是线性的了!
前面提到过,如不雅某个协程在等待某些资本,我们须要暂停它的履行,在 event loop 中注册这个事宜,以便当事宜产生的时刻,能再次唤醒该协程的履行。
- result1 = await api1()
- result2 = await api2(result1)
- result3 = await api3(result2)
是不是简单清楚明了?它的效不雅和我们前几个例子是等价的,但它的写法与我们初开端的壅塞版本几乎一致。如许能把异步与同步的编码在构造上尽量同一路来。
推荐阅读
Android必知必会-使用Intent打开第三方应用及验证可用性
基本常识此方法多用于启动体系中的功能性应用,比如打德律风、发邮件、预览图片、应用默认浏览器打开一个网页等。1. App 的人口 Activity 与其 icon一个通俗的应用默认会有一小我口 Activ>>>详细阅读
地址:http://www.17bianji.com/lsqh/37131.html
1/2 1