简体   繁体   English

使用异步函数和承诺处理递归的最佳方法?

[英]Best way to handle recursion with async functions and promises?

The following is pseudocode to illustrate my problem.以下是说明我的问题的伪代码。 The parent function must ultimately return a promise when all of the tasks are done (I've omitted the others for clarity).当所有任务都完成后,父函数最终必须返回一个承诺(为了清楚起见,我省略了其他的)。 The parent function calls child functions and some of the child functions have to perform their tasks recursively and so, for clarity, I've separated them into worker functions.父函数调用子函数,一些子函数必须递归地执行它们的任务,因此,为了清楚起见,我将它们分成了工作函数。 If there is a cleaner way I would love to learn it.如果有更清洁的方法,我很想学习它。

How best to handle the recursion in this example?在这个例子中如何最好地处理递归?

// This function must ultimately return a Promise.
async function parentFunction(uId) {
    try {
        await childFunction(uId);
        return Promise.resolve(uId);
    } catch (error) {
        console.log(error);
    }
}

async function childFunction(uId) {
    try {
        const done = await workerFunction(uId);

        if (done) {
            return Promise.resolve(true);
        } else {
            // There are more files to delete; best way to handle recursion?
        }
    } catch (error) {
        console.log(error);
    }
}

async function workerFunction(uId) {
    try {
        // Query the database, limit to 100 files.
        const query = await db.queryFiles().limit(100);

        if (query.size == 0) {
            // Nothing to delete, we're done!
            return Promise.resolve(true);
        }

        // Perform an atomic (all-or-none) batch delete that can only take 100 files at most.
        await db.batchDelete(query);
        
        // Batch delete successfull!
        if (query.size < 100) {
            // The query was less than 100 files so there can be no more files to delete.
            return Promise.resolve(true);
        } else {
            // There may possibly be more files to delete.
            // Return a promise or handle recursion here?
            return Promise.resolve(false);
        }
    } catch (error) {
        console.log(error);
    }
}

just do recursion it's fine!只要做递归就可以了!

async function deleteFiles() {
  const query = await db.queryFiles().limit(100)
  if (query.size > 0) {
    await db.batchDelete(query)
  }
  if (query.size === 100) {
    return deleteFiles()
  }
  return true;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM