import threading
import time
class Promise(object):
def __init__(self, fn):
self.fn = fn
self.callbacks = []
def then(self, callback):
print('add callback to self.callbacks')
self.callbacks.append(callback)
return self
def resolve(self, value):
print('resolve(', value, ')')
for c in self.callbacks:
c(value)
def __call__(self, *args, **kwargs):
print('__call__')
self.fn(self.resolve)
def get_http_user_info(resolve):
def get_data():
time.sleep(3)
resolve('{"username": "zhangsan"}')
threading.Thread(target=get_data).start()
data = {}
def then(value):
data['value'] = value
print('*' * 100)
print('异步得到用户数据:', data)
print('*' * 100)
Promise(fn=get_http_user_info).then(then)()
print('添加到异步请求完成')
while True:
time.sleep(1)
AJAX默认是不阻塞当前线程,在Python中则创建一个线程模拟。
Promise的第一个参数是要执行的业务代码函数,该业务函数必须传入resolve函数,手动触发then传入的回调。
当然,以上代码只是语法雏形。我们考虑一个问题,一个Promise(fn=get_http_user_info)创建之后,过了10s才调用then传入回调,那么我们的回调是不会执行的,所以在Promise异步完成需要存储结果,then的时候发现有value那么就直接调用回调而不是添加到回调函数列表里。
Promise主要基于回调,Python asyncio主要基于事件循环,两者类似,后者封装更多。
参考:https://mengera88.github.io/2017/05/18/Promise%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/
//例1
function getUserId() {
return new Promise(function(resolve) {
//异步请求
http.get(url, function(results) {
resolve(results.id)
})
})
}
getUserId().then(function(id) {
//一些处理
})
网友评论