javascript - 如何在 Python 中编写一系列 Promise?

标签 javascript python python-3.x promise python-asyncio

是否可以写出 promise 的序列? (或任务)仅使用 Python 3.6.1 Standard Library ?

例如,JavaScript 中的 promise 序列写成:

const SLEEP_INTERVAL_IN_MILLISECONDS = 200;

const alpha = function alpha (number) {
    return new Promise(function (resolve, reject) {
        const fulfill = function() {
            return resolve(number + 1);
        };

        return setTimeout(fulfill, SLEEP_INTERVAL_IN_MILLISECONDS);
    });
};

const bravo = function bravo (number) {
    return new Promise(function (resolve, reject) {
        const fulfill = function() {
            return resolve(Math.ceil(1000*Math.random()) + number);
        };
        return setTimeout(fulfill, SLEEP_INTERVAL_IN_MILLISECONDS);
    });
};

const charlie = function charlie (number) {
    return new Promise(function (resolve, reject) {
        return (number%2 == 0) ? reject(number) : resolve(number);
    });
};

function run() {
    return Promise.resolve(42)
        .then(alpha)
        .then(bravo)
        .then(charlie)
        .then((number) => {
            console.log('success: ' + number)
        })
        .catch((error) => {
            console.log('error: ' + error);
        });
}

run();

每个函数also returns a Promise具有异步处理结果,将由紧随其后的 Promise 解决/拒绝。

我知道 promises-2.01b 等库和 asyncio 3.4.3我正在寻找 Python STL 解决方案。因此,如果我需要导入非 STL 库,我更喜欢使用 RxPython而是。

最佳答案

这是一个使用 asyncio 和 async/await 语法的类似程序:

import asyncio
import random

async def alpha(x):
    await asyncio.sleep(0.2)
    return x + 1 

async def bravo(x):
    await asyncio.sleep(0.2)
    return random.randint(0, 1000) + x

async def charlie(x):
    if x % 2 == 0:
        return x
    raise ValueError(x, 'is odd')

async def run():
    try:
        number = await charlie(await bravo(await alpha(42)))
    except ValueError as exc:
        print('error:', exc.args[0])
    else:
        print('success:', number)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(run())
    loop.close()

编辑:如果您对响应式(Reactive)流感兴趣,可以考虑使用 aiostream .

这是一个简单的例子:

import asyncio
from aiostream import stream, pipe

async def main():
    # This stream computes 11² + 13² in 1.5 second
    xs = (
        stream.count(interval=0.1)      # Count from zero every 0.1 s
        | pipe.skip(10)                 # Skip the first 10 numbers
        | pipe.take(5)                  # Take the following 5
        | pipe.filter(lambda x: x % 2)  # Keep odd numbers
        | pipe.map(lambda x: x ** 2)    # Square the results
        | pipe.accumulate()             # Add the numbers together
    )
    print('11² + 13² = ', await xs)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()

documentation 中有更多示例.

免责声明:我是项目维护者。

关于javascript - 如何在 Python 中编写一系列 Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43325501/

相关文章:

javascript - CSS Transform over SVG 的 getComputedStyle 结果不正确

python - 使用 utf-8 编码后,在 Natural Reader 中用 ' 代替 '

java - 任何编程语言中的无理数表示?

python @abstractmethod 装饰器

python - 如何在使用 <iostream> 的 Python 中调用 C++ 代码

python - 为什么我将四个字节转换为二进制只有 30 个二进制数字?

javascript - 动态创建事件并将参数传递给函数

javascript - useEffect inside material ui 选项卡隐藏第三个选项卡

php - 无需持续轮询的实时 Twitter 流媒体

python - 如何在 python 中用整数制作网格?