为啥我的 apolloFetch 调用在从 promise.all 中调用时返回一个空查询?
Posted
技术标签:
【中文标题】为啥我的 apolloFetch 调用在从 promise.all 中调用时返回一个空查询?【英文标题】:Why is my apolloFetch call returning an empty query when called from within a promise.all?为什么我的 apolloFetch 调用在从 promise.all 中调用时返回一个空查询? 【发布时间】:2019-07-21 08:33:28 【问题描述】:我试图在我的 Node.js 微服务中的 Promise.all
中使用 apolloFetch
,但不断收到查询为空的错误。使用apolloFetch
的原因是调用另一个微服务并传递给它一个查询数组。有人可以给我一些方向吗?我的代码如下:
const uri = "dsc.xxx.yyyy.com/abc/def/graphql";
const apolloFetch = CreateApolloFetch(uri);
const QryAllBooks =
type: new GraphQLList(BookType),
args: ,
resolve()
return new Promise((resolve, reject) =>
let sql = singleLineString`
select distinct t.bookid,t.bookname,t.country
from books_tbl t
where t.ship_status = 'Not Shipped'
`;
pool.query(sql, (err, results) =>
if (err)
reject(err);
resolve(results);
const str = JSON.stringify(results);
const json = JSON.parse(str);
const promises = [];
for (let p = 0; p < results.length; p++)
const book_id = json[p].bookid;
const query = `mutation updateShipping
updateShipping
(id: $book_id, input:
status: "Shipped"
)
bookid
bookname `;
promises.push(query);
//Below is the Promise.all function with the
//apolloFetch that calls another graphql endpoint
//an array of queries
Promise.all(promises.map(p => apolloFetch(p))).then((result) =>
//this is the problem code^^^^^^^^^^^^^^^^^^^^^
resolve();
console.log("success!");
).catch((e) =>
FunctionLogError(29, "Error", e);
);
);
);
;
module.exports =
QryAllBooks,
BookType
;
【问题讨论】:
【参考方案1】:看起来 apolloFetch 需要 query
- 你正在传递 p
改变
Promise.all( promises.map(p=>apolloFetch(p)) )
到
Promise.all( promises.map(query=>apolloFetch(query)) )
你也调用了两次 resolve
解决所有错误或成功
const final_results = []
Promise.all(promises.map(query => apolloFetch(
query,
))).then((result) =>
final_results.push(result)
).catch((e) =>
final_results.push(e)
).then(() =>
resolve(final_results)
);
【讨论】:
如果你的意思是在 Promise.all 块内调用 resolve - 我把它放在那里是为了通过我的 eslint 测试,如果该块内没有任何东西,它就会失败。你能建议如何克服这个问题,或者我做的 Promise.all 本身是错的吗? 我认为您误解了p
语法的工作原理。那是 p: p
的ES6“简写”——apolloFetch
期望的是一个带有query
键的对象。因此,您需要通过 query
更改名称或 query: p
以传递 apolloFetch 期望的正确对象
我还将promises
数组更改为queries
,因为这是一个查询数组,在您的map
中,您将返回从apolloFetch
返回的promise
跨度>
不,我得到了那部分 - 我从 p 更改为 query,它现在正在工作。你的回答解决了我的问题。现在我必须解决一些错误,例如如何正确解决该特定调用并进行错误记录,以便我可以记录所有错误,而不是只记录一个可能返回的错误(换句话说,我已经找到了一种方法确保整个查询数组都运行,那些失败的被传递到记录器函数中)。
Idk 如果这是您要查找的内容,但编辑显示了如何获取所有回复并将其发回【参考方案2】:
pool.query()
回调开始后,您立即解决或拒绝:
if(err) reject(err);resolve(results);
因此,除非查询失败,否则您永远不会使用 apolloFetch 调用的结果进行解析,因为 promise 已经使用 pool.query() 结果解析。我猜你错过了else
块:
if( err )
reject();
else
const promises = ...
PS:您也可以尝试使用 node.js 的 util.promisify() 将 pool.query()
转换为 Promise,这样您就可以编写类似:query(...).then(results=>results.map(apolloFetch)
的内容,而不是混合回调和 Promise。
【讨论】:
pool.query 是我的团队其他成员正在使用的标准,如果我改变这种模式,我会不满意。对于您的第一部分 - pool.query 用于第一个查询,该查询返回填充名为 promises[] 的数组的行。 apolloFetch 实际上是在调用另一个带有突变查询的微服务端点。话虽如此,我仍然在 pool.query 和 if 子句中做错了吗?以上是关于为啥我的 apolloFetch 调用在从 promise.all 中调用时返回一个空查询?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 IIS7 应用程序池在从 ASP.NET 页面调用的 DLL 中出现异常后关闭?
为啥我的应用程序在从自定义视图启动 Activity 后关闭?
为啥“this”在从 HTML 元素调用的 React 函数中为空 [重复]