美文网首页
Promise Python实现

Promise Python实现

作者: 霡霂976447044 | 来源:发表于2020-07-16 10:02 被阅读0次
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) {
    //一些处理
})

相关文章

网友评论

      本文标题:Promise Python实现

      本文链接:https://www.haomeiwen.com/subject/elouhktx.html