[英]Returning value from async function node.js
我知道这是 javascript 中关于函数异步行为的最常见问题。 我仍然无法为我的用例找到可行的解决方案。 我要做的是使用密钥查找 redis 缓存。 我正在使用存在的 function 来检查密钥是否存在。 如果存在,那么我将从缓存中返回,否则我将设置密钥,然后使用此密钥作为数据库参数进行数据库调用。 这看起来很简单,但无论我做什么,我都无法从缓存或数据库中返回值。 如果我在现有的 function 之外进行这些调用,那么它将作为解析器函数(graphql 解析器)是异步 function。 这个解析器函数需要一个返回值。 所以这是我无法在任何情况下重新调整值的代码: -
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); }
我在控制台中获得了正确的值,但无法返回。 但是,如果我直接在我的解析器 function 中进行这些调用,即在 redis 之外存在 function 我能够返回该值。
empId: async(obj, params, ctx, resolverInfo) => { return await getAsync(obj.empId).then(res => { console.log(res); return res;
这样我就可以从解析器 function 返回值。 如果有人可以为此提供工作代码而不是其他有关如何使用回调和承诺从异步 function 返回的链接,那将非常有帮助。 这是另一个相同的帖子。 :- Redis 异步库没有 redis 库中的 function提前致谢!
如果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
调用包装到异步 function 中并使用await
关键字调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.