Bluebird 协同程序与 Node Redis



我正在尝试使用带有 yield 的节点 redis,但找不到实现此目的的正确方法。

基本上我希望能够等待承诺解析,使我的异步代码看起来像同步代码(相当于 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}}

看起来收益率没有影响,代码不要等待承诺的解决。

我知道我可以使用 co-redis ,但出于兼容性原因,我想使用 node redis 来做到这一点。

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

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 是一个非常强大的 JavaScript 功能。有了它,我发现自己很少明确地使用承诺。

注意:在生产应用中,请确保将所有异步调用括在 try catch 块中,以捕获被拒绝的承诺。

注2:我上面说错了。你仍然需要在蓝鸟中使用promisifyAll。节点 8 有一个 promisify 函数,但我忘记了它一次只适用于一个函数。

最新更新