Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我得到了一个“包装承诺不可编辑错误”,即使我只有一个参数_Javascript_Node.js_Es6 Promise_Apollo - Fatal编程技术网

Javascript 我得到了一个“包装承诺不可编辑错误”,即使我只有一个参数

Javascript 我得到了一个“包装承诺不可编辑错误”,即使我只有一个参数,javascript,node.js,es6-promise,apollo,Javascript,Node.js,Es6 Promise,Apollo,我试图在node.js微服务中使用Promise.all。Promise.all的目的是遍历查询数组中的所有元素,并通过apolloFetch调用另一个微服务,该微服务随后在数据库中执行这些查询,然后返回成功或错误。我得到了一个“包装的承诺是不可编辑的”错误-我检查了一些帖子,因此有类似的错误,但在所有这些情况下,有2个参数被传递,而我只传递了一个-除了我使用apolloFetch连接到另一个微服务,该微服务接受数组中的每个查询,然后对数据库执行一些操作 有人能找出我做错了什么吗: c

我试图在node.js微服务中使用Promise.all。Promise.all的目的是遍历查询数组中的所有元素,并通过apolloFetch调用另一个微服务,该微服务随后在数据库中执行这些查询,然后返回成功或错误。我得到了一个“包装的承诺是不可编辑的”错误-我检查了一些帖子,因此有类似的错误,但在所有这些情况下,有2个参数被传递,而我只传递了一个-除了我使用apolloFetch连接到另一个微服务,该微服务接受数组中的每个查询,然后对数据库执行一些操作

有人能找出我做错了什么吗:

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

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

我认为答案是:

有人能找出我做错了什么吗

是的,您不允许apolloFetch返回与iterable集合不同的内容

相反,调用apolloFetch,确定返回值是否是iterable;只有当它是可接受的,才称之为承诺


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

好的,我跳过了这个错误,使用map函数来分隔数组中的每个项,它本质上是一个查询,但是现在我得到一个错误,查询没有被传递。我更新了上面的代码以反映我所做的努力。@RogerDodger,感谢您报告这就是答案。你能把这个答案标为正确吗?你的单独问题应该作为一个新问题来提出,读者需要理解这个新问题的上下文。bignose-这不是答案-我已经通过了一个错误,但现在我在'p'中得到一个空值,它作为apolloFetch调用的参数传递。我甚至不知道我是否在正确的轨道上,因为我没有确认我打电话的方式是否合法。如果我接受它作为答案,那么下一步该怎么解决我的问题呢?@RogerDodger,一个问题引出新问题是很正常的。我们处理这一问题的方法是,如果他们正确回答了原始问题,则保留原始答案并标记为正确,然后根据需要创建新问题。我按照您的建议这样做了,并在此处创建了另一个后续问题,除非我得到有效的解决方案,否则我不会将其标记为已回答: