我知道这是javascript中有关函数异步行为的最常见问题。我仍然无法为我的用例找到一个可行的解决方案。 我想做的是使用密钥查找Redis缓存。我正在使用exists函数来检查密钥是否存在。如果存在,那么我将从缓存中返回,如果不存在,那么我将设置密钥,然后使用此密钥作为数据库参数进行数据库调用。看起来非常简单,但是无论我做什么,我都无法从缓存或数据库中返回值。如果我在exist函数之外进行这些调用,则它将作为解析器函数(graphql解析器)是一个异步函数。此解析器函数期望返回值。 因此,这是在任何情况下我都无法通过其重新调整值的代码:-
empId: async(obj, params, ctx, resolverInfo) => {
await client.exists(obj.empId, async function(err, reply) {
if (reply == 1) {
return await getAsync(obj.empId).then(res => {
console.log(res);
return res;
})
} else {
return await db.one('SELECT * FROM iuidtest WHERE empid = $1', [obj.empId])
.then(iuidtest => {
console.log(iuidtest.empid);
return iuidtest.empid;
})
}
});
const doSomethingWith = empid => {
console.log("empid = ", empid);
}
我在控制台中获得正确的值,但无法返回。但是,如果我直接在我的解析器函数中进行这些调用,即在redis存在函数之外,我就可以返回该值。
empId: async(obj, params, ctx, resolverInfo) => {
return await getAsync(obj.empId).then(res => {
console.log(res);
return res;
这样,我可以从解析器函数返回值。如果有人可以为此提供工作代码,而不是其他有关如何使用回调和Promise从异步函数返回的链接,那将确实有很大的帮助。这是另一个帖子注册相同。 :- Redis async library does not have function that are in redis library for node.js 预先感谢!
答案 0 :(得分:1)
如果client.exists
返回promise,则可以编写相同的代码,如下所示:
empId: async (obj, params, ctx, resolverInfo) => {
const exists = await client.exists(obj.empId);
if (exists === 1) {
return getAsync(obj.empId);
}
return await db.one('SELECT * FROM iuidtest WHERE empid = $1', [obj.empId])
.then(iuidtest => {
return iuidtest.empid;
});
}
如果client.exists
仅接受回调,则代码可以写为:
empId: async (obj, params, ctx, resolverInfo) => {
async function empIdExists(empId) {
return new Promise(function resolver(resolve, reject) {
client.exists(obj.empId, function(err, reply) {
if (err) {
reject(err);
return;
}
if (reply == 1) {
resolve(1);
return;
} else {
resolve(0);
return;
}
})
});
}
const exists = await empIdExists(obj.empId);
if (exists === 1) {
return getAsync(obj.empId);
}
return await db.one('SELECT * FROM iuidtest WHERE empid = $1', [obj.empId])
.then(iuidtest => {
return iuidtest.empid;
});
}
在第二个版本中,请注意,我已将client.exists
调用包装到一个异步函数中,并使用await
关键字进行了调用。