Я получаю сообщение об ошибке «Обернутое обещание, а не итерация», хотя у меня есть только один параметр - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь использовать Promise.all в моем микросервисе node.js.Назначение Promise.all - пройти через все элементы в массиве (запросов) и через apolloFetch вызвать другой микросервис, который затем выполняет эти запросы в базе данных и затем возвращает обратно успех или ошибку.Я получаю сообщение об ошибке «Обернутое обещание не повторяется» - я проверил несколько сообщений на SO, в которых есть похожие ошибки, но во всех этих случаях передается 2 аргумента, тогда как я передаю только один - за исключением того, что яиспользуя apolloFetch для соединения с ДРУГИМ 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 Ответ

0 голосов
/ 27 февраля 2019

Код получает возвращаемое значение от вызова apolloFetch и безоговорочно передает его на Promise.all.

Я думаю, что ответ на:

Может кто-нибудь выяснить, чтоЯ делаю неправильно здесь

, вы не допустили случай, когда apolloFetch возвращает что-то отличное от повторяемой коллекции.

Вместо этого вызовите apolloFetch, figureout вне зависимости от того, является ли возвращаемое значение итеративным;и только , если итеративен, вызывайте Promise.all.

Если apolloFetch возвращает что-то отличное от итерируемого, вам нужно решить, как должен вести себя ваш код.В настоящее время возникает ошибка, которая, очевидно, не то, что вы хотите;но вам нужно решить, что вы хотите в этом случае.

...