【问题标题】:How to call an original promise resolution when in recursive function在递归函数中如何调用原始承诺解决方案
【发布时间】:2021-12-17 09:17:48
【问题描述】:

我编写了以下 lambda 函数来从 API 中获取数据并将其放入数据库中。当 API 只返回一个页面时,这工作正常,但是在 resolve() 运行之前 > 1 页 parseData 运行,但永远不会触发“功能完成”日志。这是resolve() 没有解决我期望的承诺吗?

 exports.handler = async (event, context, callback) => {
  let db = await initDB(); // External function
  await api_get('users')
  console.log("Function finished");
  db.end()
  callback(null)

  function api_get(type, page = 1, count = 0, results = []) {
    return new Promise(async function(resolve, reject) {
        let uri = `https://api.com/v1/${type}`;
        request.get(uri + '?page=' + page, async (error, response, body) => {
          const data = JSON.parse(body);
          results.push(data.users)
          current_count = count + data.meta.count
          if (current_count < data.meta.total) {
              await api_get(type, page + 1, current_count, results);
          }
          else {
              await parseData(type, results)
              resolve()
          }
        });
    });
   }
   
  
   function parseData(type, data) {
      return new Promise(async function(resolve, reject) {
         switch (type) {
            case 'users':
               let users = [].concat(...data)
               let sql = ''
               for (const user of users) {
                  sql = sql + `INSERT INTO users (user_id) VALUES ('${user_id}');`
               }
               db.query(sql)
               .then( () => {
                  resolve()
               })
            break;
         }
      });
   }
 };

【问题讨论】:

标签: javascript node.js aws-lambda promise


【解决方案1】:

如果满足此条件,则不会调用 resolve():

      if (current_count < data.meta.total) {
          // If execution go in this block, you are never calling "resolve()"
          await api_get(type, page + 1, current_count, results);
      }
      else {
          await parseData(type, results)
          resolve()
      }

【讨论】:

  • 对不起,我可能不太清楚。 current_count 每次调用都会递增,因此 parseData() 会运行,只是 resolve() 似乎没有按照我的预期进行
  • 所以我只希望在 current_count 完成递增后只有resolve() - 即我们拥有所有结果并解析它们,然后我们返回。
  • 你基本上是在嵌套 Promise (因为你在递归中)。因此,在每次递归迭代中,您需要一个 resolve() 才能一直返回到递归函数的顶部调用。因此,在每次执行 api_get 函数时,您都必须使用 resolve()。如果满足条件(current_count
  • 谢谢@munleashed!你完全正确,效果很好。我想我对 Promise 的工作原理有一些基本的误解。我去读书,谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-12-23
  • 2021-06-01
  • 2015-12-08
  • 2023-03-28
  • 1970-01-01
  • 2022-10-31
  • 2018-07-31
  • 2023-03-30
相关资源
最近更新 更多