javascript - 页面评估的返回值( puppeteer 操纵者,异步编程)

标签 javascript node.js asynchronous evaluate puppeteer

我遇到了以下问题: 我在 puppeteer 中有一个页面评估,其中包括异步部分。我想将异步部分的值返回给 puppeteer,但是,它只是返回 undefined 而没有等待 Promise 解析。有没有人如何解决这个问题?

我的示例代码:

const puppeteer = require('puppeteer');
async function testing(num) {
  const browser = await puppeteer.launch({
    headless: false,
    ignoreHTTPSErrors: true
  });
  const page = await browser.newPage();
  const evaluating = await page.evaluate((num) => {
    //some synchrnous stuff (declaring some variablesand so on...)
    function lookForNumber(num) {
      if (num > 2) {
        var asyncstuff = setTimeout(function () {
          if (num > 10) {
            console.log('number is greater than 9');
            var whatIwantToRetrun = 'ten';
            return Promise.resolve(whatIwantToRetrun);
            //return here
          }
          if (num > 5 && num < 10) {
            console.log('number is samller than 10');
            var whatIwantToRetrun = 'nine';
            return Promise.resolve(whatIwantToRetrun);
            //return here
          }
          else {
            num++;
            lookForNumber(num)
          }
        }, 2000);
      }
    }
    lookForNumber(num)
  }, num)
  console.log(evaluating); // returns undefined before function has finished
}
testing(4)

puppeteer 师示例:

const result = await page.evaluate(() => {
  return Promise.resolve(8 * 7);
});
console.log(result); // prints "56"

Chromes API on evaluate

根据 this link和更新的 API,puppeteer 总是评估代码,如果评估是一个 promise ,则等待 promise 解决并返回 promise 值。

在此先感谢您的帮助!

编辑:我想通了!

最佳答案

我的问题的解决方案:

const puppeteer = require('puppeteer');
let date = require('date-and-time');
async function testing(num) {
  const browser = await puppeteer.launch({
    headless: true,
    ignoreHTTPSErrors: true
  });
  const page = await browser.newPage();
  await console.log('starting evaluation');
  let now = new Date();
  let time = date.format(now, 'YYYY/MM/DD HH:mm:ss');
  console.log(time);
  const test = await page.evaluate(async (num) => {
    console.log('starting evaluation');
    //some synchrnous stuff (declaring some variablesand so on...)
    function lookForNumber(num) {
      return new Promise((resolve, reject) => {
        if (num > 2) {
          var asyncstuff = setTimeout(function () {
            if (num > 10) {
              console.log('number is greater than 9');
              var whatIwantToReturn = 'ten';
              resolve(whatIwantToReturn);
            }
            if (num > 5 && num < 10) {
              console.log('number is samller than 10');
              var whatIwantToReturn = 'nine';
              resolve(whatIwantToReturn);
            }
            else {
              num++;
              lookForNumber(num)
            }
          }, 5000);
        }
      });
    }
    var returnvalue = await lookForNumber(num);
    return returnvalue;
  }, num)
  console.log(test);
  now = new Date();
  time = date.format(now, 'YYYY/MM/DD HH:mm:ss');
  console.log(time);
  await browser.close();
}
testing(6)

关于javascript - 页面评估的返回值( puppeteer 操纵者,异步编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46524997/

相关文章:

javascript - 将一维二进制数组拆分为仅连续的二维数组

javascript - Angular 6 带 2 个路由器 socket

javascript - 将表单输入显示为程式化字符串 - Javascript

node.js - 多个路径同时匹配-奇怪的快速行为

android - 异步任务方法调用在 android 中非常慢

c# - 如何通过对原始序列的值运行任务来创建 Rx 序列?

javascript - 每种应用样式都会发生一次回流吗?

node.js - 由于 require-from-string 导致使用 npm 安装 Angular 时出错

javascript - 从服务器到客户端 Node.js 的文件传输

asynchronous - F# 使用关键字和递归函数