首
现在在很多编码中,callback 已经成为一种日常编码的方式,虽然我们追求 simple 的编码方式,但是熟练掌握 callback 很有必要
callback 是一种功能抽象
在不少集合算法,会使用 callback 作为抽象接口
def for_each(collection, callback):
for i in collection:
callback(i)
if __name__ == '__main__':
import pprint
for_each([1, 2, 3], lambda i: pprint.pprint(i))
并发编程。callback 是唯一的抽象方式。
import time
def task_calback():
print('process is running')
time.sleep(3)
print('process is done')
if __name__ == '__main__':
p = Process(target=task_calback)
p.start()
例外: 协程。通过协程来解耦 callback
function resolveAnyThing(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 2000);
});
}
# callback
resolveAnyThing()
.then((x) => {
console.log(`resolveAnyThing is done, ${x}`);
})
# await
async function fn() {
var x = await resolveAnyThing(10);
console.log(x); // 10
}
fn();
callback 要遵守可读性原则,不为了抽象而抽象
避免 A -> B -> A
,复杂的非线性调用链。
如果语言支持更简单的使用方式,可以不用 callback。
# 略
if __name__ == '__main__':
import pprint
for_each([1, 2, 3], lambda i: pprint.pprint(i))
# 更直观和简单的做法
for i in [1, 2, 3]:
pprint.pprint(i)
# 或者
[
pprint.pprint(i)
for i in [1, 2, 3]
]
如果线性代码的可读性维护性都不错,不需要callback。
终
callback 已经在很多语言和领域中被使用,将来也会越来越被重视,习惯它吧。