为啥我的 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=&gt;results.map(apolloFetch) 的内容,而不是混合回调和 Promise。

【讨论】:

pool.query 是我的团队其他成员正在使用的标准,如果我改变这种模式,我会不满意。对于您的第一部分 - pool.query 用于第一个查询,该查询返回填充名为 promises[] 的数组的行。 apolloFetch 实际上是在调用另一个带有突变查询的微服务端点。话虽如此,我仍然在 pool.query 和 if 子句中做错了吗?

以上是关于为啥我的 apolloFetch 调用在从 promise.all 中调用时返回一个空查询?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 IIS7 应用程序池在从 ASP.NET 页面调用的 DLL 中出现异常后关闭?

为啥我的应用程序在从自定义视图启动 Activity 后关闭?

为啥我的VS下QT工程无法生成.pro

为啥“this”在从 HTML 元素调用的 React 函数中为空 [重复]

为啥单击编辑文本后不显示qml虚拟键盘,而我在.pro和main.cpp中调用插件

为啥在从 C# 创建的进程中运行 bash 命令时我的 $PATH 不同?