gpt4 book ai didi

node.js - bluebird 协程与 Node redis

转载 作者:可可西里 更新时间:2023-11-01 10:53:43 25 4
gpt4 key购买 nike

我正在尝试将 node redis 与 yield 结合使用,但找不到合适的方法来实现这一点。

基本上我希望能够等待 promise 解析以使我的异步代码看起来像同步代码(相当于 c# yield)

我做了一个像这样的简单测试,但它不起作用:

const redisLib = require("redis")
const Promise = require("bluebird")

Promise.promisifyAll(redisLib)

var express = require('express'),
redis = redisLib.createClient({ host: '127.0.0.1', port: 6379 }),

const redisGetYield = Promise.coroutine(function* (key) {
const redis = app.get("redis")
let val = yield redis.getAsync(key)
return val
})

app.get("/test",function(req,res,next)
{
let val = redisGetYield("test")
return res.json({'val':val}).end()
})

在我的浏览器中显示的输出是:

{"val":{"isFulfilled":false,"isRejected":false}}

看起来 yield 没有效果,代码不等待 promise 的解决。

我知道我可以使用 co-redis ,但出于兼容性原因,我想将其与 Node redis 一起使用。

最佳答案

这是一个使用 Node 8 的 promisify 的解决方案。有了它,你就不需要 bluebird 协程了:

const Promise = require("bluebird")
const redis = Promise.promisifyAll(require('redis'))
const express = require('express'),

let client = redis.createClient({
host: '127.0.0.1', port: 6379
}));

app.get('/test', async (req, res, next) => {
let val = await client.get('test');
return res.json({ val }).end();
});

Async/await is an extremely powerful JavaScript feature.有了它,我发现自己很少明确使用 promises。

注意:在生产应用中,确保将所有异步调用包围在 try catch block 中以捕获被拒绝的 promise 。

注意 2: 我在上面说错了。您仍然需要在 bluebird 中使用 promisifyAll。 Node 8 has a promisify函数,但我忘了它一次只能作用于一个函数。

关于node.js - bluebird 协程与 Node redis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49097132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com