我正在尝试使用带有 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 函数,但我忘记了它一次只适用于一个函数。