即使我只有一个参数,我也会收到“包装承诺不可迭代错误”

Posted

技术标签:

【中文标题】即使我只有一个参数,我也会收到“包装承诺不可迭代错误”【英文标题】:I'm getting a 'Wrapped promise not iterable error' even though I have only one parameter 【发布时间】:2019-07-20 15:58:02 【问题描述】:

我正在尝试在我的 node.js 微服务中使用 Promise.all。 Promise.all 的目的是遍历(查询)数组中的所有元素,并通过 apolloFetch 调用另一个微服务,然后在数据库中执行这些查询,然后返回成功或错误。我收到“包装的承诺不可迭代”错误 - 我检查了一些关于 SO 的帖子,它们有类似的错误,但在所有这些情况下,都传递了 2 个参数,而我只传递了一个 - 除了我是使用 apolloFetch 连接到另一个 MICROSERVICE,该 MICROSERVICE 接受每个查询(在数组中),然后对数据库执行一些操作。

有人能弄清楚我在这里做错了什么吗:

     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 );
           

          //I need an await function so that previous apolloFetch  
          //goes in sequence of bookid, one after the other

          Promise.all( promises.map(p=>apolloFetch(p)) ).then((result) => 
         
                  resolve();
                  console.log("success!");
                  )
                 .catch(( e ) => 
                     FunctionLogError( 29, 'Error', e );
                 );
                  );
            );
        
      ;

   module.exports = 
          QryAllBooks,
          BookType
   ;

【问题讨论】:

【参考方案1】:

代码获取调用apolloFetch的返回值,并无条件地将其提供给Promise.all

我认为答案是:

谁能弄清楚我在这里做错了什么

是,您不允许apolloFetch 返回与可迭代集合不同的内容。

改为调用apolloFetch,判断是否返回值是可迭代的;只有如果它是可迭代的,调用Promise.all

如果apolloFetch 返回的不是可迭代对象,您需要决定代码的行为方式。目前它引发了一个错误,这显然不是你想要的;但你需要决定在这种情况下你想要什么。

【讨论】:

好的,所以我克服了错误并使用 map 函数来分隔数组中的每个项目,这本质上是一个查询,但现在我收到一个错误,即查询没有被传递.我更新了上面的代码以反映我的尝试。 @RogerDodger,感谢您报告这就是答案。你能把这个答案标记为正确吗?您的单独问题应作为一个新问题提出,并结合读者理解该新问题所需的上下文。 bignose - 这不是答案 - 我克服了一个错误,但现在我在 'p' 中得到一个空值,它作为 apolloFetch 调用的参数传递。我什至不知道我是否走在正确的轨道上,因为我无法确认我进行 apolloFetch 调用的方式是否合法。如果我接受它作为答案,接下来要如何找出并解决我的问题? @RogerDodger,一个问题引出新问题是正常的。我们处理这个问题的方式是保留原始问题(如果他们正确回答原始问题,则将答案标记为正确),然后根据需要创建新问题。 我按照您的建议做了,并在此处创建了另一个后续问题(除非我得到可行的解决方案,否则我不会将其标记为已回答):***.com/questions/54908549/…

以上是关于即使我只有一个参数,我也会收到“包装承诺不可迭代错误”的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使实现了 Iterable,我也会收到 foreach 编译器错误?

为啥即使我使用 sparse_categorical_crossentrpy,我也会收到“收到超出 [0, 1) 有效范围的标签值 6”?

即使我将变量分配为 var,我也会收到“Val 无法重新签名错误”?

即使代码在 try/catch 块中,我也会不断收到异常 [关闭]

为啥即使在包含 math.h 并使用 -lm 链接到数学库之后我也会收到“未定义的符号:.sqrtf”

即使在添加 ojdbc14.jar 文件后,我也会收到 HTTP 错误 500