【问题标题】:Await javascript recursive function to return true等待javascript递归函数返回true
【发布时间】:2019-02-20 08:40:50
【问题描述】:

所以我在 nodeJS 中使用 puppeteer,并且我有一个函数可以递归调用自身,直到正确加载指定的页面:

const isPageAccessible = async (page, url) => {
    var pageRes = await page.goto(url, {
        timeout: 10000
    }).catch(e => console.log(e));
    if (!pageRes || pageRes.status !== 200) {
        console.log("Website didn't load properly.")
        isPageAccessible(page, url);
    } else {
        console.log("Loaded!")
        return true;
    }
}

这里的问题是这个函数在第一次递归调用之后返回 undefined(据我所知这是正常的,因为异步函数必须用一个值解析)。我希望代码等到这个函数用true解析

console.log(await isPageAccessible(page,LOGIN_URL));

console.log("Done!")

所以控制台会记录“完成!”网站加载成功后。现在它正在记录“完成!”即使网站没有加载,因为isPageAccessible 函数在第一次调用后返回 undefined。

任何关于如何解决此问题的想法将不胜感激!

【问题讨论】:

  • 为什么不使用循环?
  • 你不是在等待递归调用或转发它的结果。

标签: javascript node.js async-await puppeteer


【解决方案1】:

你需要return递归调用Promise链:

if (!pageRes || pageRes.status !== 200) {
  console.log("Website didn't load properly.")
  return isPageAccessible(page, url);
}

【讨论】:

    【解决方案2】:

    改用这个 npm 模块,
    https://www.npmjs.com/package/sync-request

        var request = require('sync-request');
        var res = request('GET', 'http://example.com');
        console.log(res.getBody());
        console.log("Done!")
    

    所有语句将在完成后依次执行。
    我猜代码更小!

    【讨论】:

    • 那么您是否建议 OP 应该放弃 puppeteer 并改用同步请求?
    猜你喜欢
    • 2019-08-23
    • 2023-03-24
    • 2011-03-04
    • 1970-01-01
    • 2012-05-29
    • 2012-04-24
    • 2018-08-02
    • 1970-01-01
    相关资源
    最近更新 更多