如何在请求成功完成后执行callback方法?回调不触发问题求助
问题根因与修复方案
- 你在
.end()中直接写callback()属于立即执行函数,会在sendSearchRequest调用时就触发callback,而非请求结束后执行。end方法需要接收函数引用作为参数,而非函数执行结果。 - 你使用了
async/await语法,但常规的request库默认是回调风格,不返回Promise实例,await不会等待请求完成,逻辑执行顺序不符合预期。 - 存在笔误:
consolel.log多写了一个字母l,会触发未定义方法报错。 - 若
downloadPDFsOfPage为异步方法,当前循环调用不会等待其执行完成,callback触发时可能PDF相关逻辑还未跑完。
完整修复代码(适配async/await语法,保证所有逻辑执行完成后触发callback)
async function sendSearchRequest(config, search_url, message, ambiente, callback){ const options = { 'method': 'POST', 'url': 'https://www.example.com', 'headers': { // 原有header配置 }, form: {/* 原有表单配置 */} }; // 把回调风格的request包装为Promise适配await const requestTask = new Promise((resolve, reject) => { request(options, async function (error, response) { if (error) { console.log("Error!----------------------------", error); return reject(error); } const $ = cheerio.load(response.body); const szPages = $('#divResultadosSuperior').find('table > tbody > tr > td:first-child').text(); const szTexts = szPages.split(' '); const nPages = Math.ceil(szTexts[szTexts.length - 2] / 10); console.log("This is Number of Page: -----------", nPages); // 等待所有PDF下载任务完成 const downloadTasks = []; for(let i = 1; i <= nPages; i ++) { downloadTasks.push(downloadPDFsOfPage(i, response.headers['set-cookie'][0], pdf_lists, search_url, message)); } await Promise.all(downloadTasks); resolve(); //await scrapPdf(response.body, response.headers['set-cookie'][0]); }) }) // 等待所有请求、业务逻辑执行完成后再调用callback await requestTask; callback(); }
最简修复方案(仅修复callback调用时机,不调整原有逻辑结构)
仅修改.end的传参,去掉callback后的括号,传入函数引用而非执行结果即可:
.end(callback)
注意该方案不会等待downloadPDFsOfPage的异步逻辑执行完成,callback触发时PDF下载任务可能还在运行。
内容的提问来源于stack exchange,提问作者dev-ninja
相关产品推荐
相关产品推荐

