【问题标题】:Trying to use await with promise in my code here - how to?尝试在我的代码中使用 await with promise - 如何?
【发布时间】:2019-02-26 05:05:56
【问题描述】:

我已经尝试过,但未能清楚地掌握 javascript 的 promise 和 await 是如何工作的!我以某种方式设法拼凑了一个功能,该功能在我的 node.js 微服务中执行我需要的功能,但我不确定我是否以正确(最佳)的方式进行操作。此外,我在没有等待的情况下使用 Promise 实现了我想要的,但我还没有对我的代码进行任何广泛的测试,以查看它是否确实按照我认为的方式运行。这是我目前拥有和工作的代码,但我不确定我是否缺少使用 await 来正常运行:

  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(apolloFetch({ query }));
               }

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

              Promise.all( promises ).then(( result) => {
                      errorLogger(27, 'Error', result);
                      })
                     .catch(( e ) => {
                         errorLogger( 29, 'Error', e );
                     )};
                      });
                });
            }
          };

       module.exports = {
              QryAllBooks,
              BookType
       };

【问题讨论】:

  • 避免使用Promise constructor antipattern - 在promise 执行器内部调用resolve 之后,您不应该做任何事情。将所有这些东西放在new Promise 上的then 回调中!
  • "但我不确定我是否缺少使用 await 来正常运行:" 代码没有丢失 await,因为 resolve 不是 @ 987654329@ 功能。代码缺少 .catch() 链接到 .then() 以处理错误。
  • Bergi/guest271314 - 又是我的错误 - 在尝试输入我错过的所有内容时,我在我的实时工作功能中拥有的 catch 块。我无法理解将 await 与 promise 一起使用的概念,以便所有 bookid 都按顺序执行,而不是让 promise 处理该部分。如何添加等待以确保它们(bookid)全部按顺序执行?

标签: javascript node.js async-await es6-promise


【解决方案1】:

避免使用Promise constructor antipattern - 在promise 执行器内部调用resolve 之后,您不应该做任何事情。将所有这些东西放在new Promise 上的then 回调中:

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);
            else resolve(results);
        });
    }).then(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(apolloFetch({ query }));
        }
        return Promise.all(promises);
    }).then(result => {
        errorLogger(27, 'Result', result);
        return result;
    }, err => {
        errorLogger(29, 'Error', err);
        throw err;
    )};
}

您现在可以用await 语法替换那些then 调用。并在循环中将Promise.all 替换为连续的awaiting:

async resolve() {
   try {
        const results = await 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);
                else resolve(results);
            });
        });
        const promises = results.map(res => {
            const book_id = res.bookid;
            const query = `mutation updateShipping {
                updateShipping(id: ${book_id}, input:{
                    status: "Shipped"
                }) { bookid
                     bookname }
                }`;
            return apolloFetch({ query });
        });
        const result = await Promise.all(promises);
//                     ^^^^^
        errorLogger(27, 'Result', result);
        return result;
    } catch(err) {
        errorLogger(29, 'Error', err);
        throw err;
    }
}

async resolve() {
    const results = await 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);
            else resolve(results);
        });
    });
    const fetches = [];
    for (let p = 0; p < results.length; p++){
        const book_id = results[p].bookid;
        const query = `mutation updateShipping {
            updateShipping(id: ${book_id}, input:{
                status: "Shipped"
            }) { bookid
                 bookname }
            }`;
        fetches.push(await apolloFetch({ query }));
//                   ^^^^^
    }
    return fetches;
}

【讨论】:

  • Bergi - 我没有关注 - 我需要将所有功能包装到 QryAllBooks 中;另外-您的代码的第三块是否替换了第二块?我很困惑。
  • 所有三个 sn-ps 基本上都做同样的事情。 (好的,我省略了后两者的奇怪日志记录)
  • Bergi - 好的,我现在知道了 - 但是等待呢?我不需要它来确保按顺序拨打电话吗?我的意思是 - 我将如何适应这段代码中的等待? (在您修改后的代码中)
  • 后两个sn-ps已经使用await。 (顺便说一句,then 也确保了排序)
  • 我的错误 - 道歉!很快就会尝试并更新!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 2023-03-12
  • 1970-01-01
  • 2018-01-03
相关资源
最近更新 更多