Как вызвать внешнюю функцию в функции анонимного вызова - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь вызвать функцию карты с обратным вызовом. Но я не смог вызвать функцию обратного вызова со следующими сообщениями об ошибках.

> tsc && node index.js

(node:17460) UnhandledPromiseRejectionWarning: Error: Evaluation failed: ReferenceError: translateText is not defined
    at mapFunc (__puppeteer_evaluation_script__:3:13)
    at Array.map (<anonymous>)
    at __puppeteer_evaluation_script__:13:22
    at ExecutionContext.evaluateHandle (C:\github\dojo-tools\node_modules\puppeteer\lib\ExecutionContext.js:121:13)
    at process._tickCallback (internal/process/next_tick.js:68:7)
  -- ASYNC --
    at ExecutionContext.<anonymous> (C:\github\dojo-tools\node_modules\puppeteer\lib\helper.js:110:27)
    at ExecutionContext.evaluate (C:\github\dojo-tools\node_modules\puppeteer\lib\ExecutionContext.js:48:31)
    at ExecutionContext.<anonymous> (C:\github\dojo-tools\node_modules\puppeteer\lib\helper.js:111:23)
    at ElementHandle.$$eval (C:\github\dojo-tools\node_modules\puppeteer\lib\JSHandle.js:453:50)
    at process._tickCallback (internal/process/next_tick.js:68:7)
  -- ASYNC --
    at ElementHandle.<anonymous> (C:\github\dojo-tools\node_modules\puppeteer\lib\helper.js:110:27)
    at getHTML (C:\github\dojo-tools\index.js:77:32)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:17460) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:17460) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Я хотел бы вызвать внешнюю функцию в функции обратного вызова. Потому что я хотел бы обработать каждый элемент массива.

Ниже мой текущий код.

function translateText() {...}

async function getHTML() {
    const browser = await puppeteer.launch({
        headless: false
    });

    const func = (nodes: Array<Element>) => {
        const mapFunc = (n: Element) => {
            translateText(n.textContent || "NO STRING"); // <-------- ERROR
            switch (n.tagName) {
                case 'P':
                    return `  * ${n.textContent}`;
                case 'LI':
                    return `    * ${n.textContent}`;
                default:
                    return `    * COULDNOT ANALYZE - ${n.textContent}`;
            }
        }
        return nodes.map(mapFunc);
    }

    const page = await browser.newPage();
    await page.goto('https://azure.microsoft.com/en-us/updates/the-azure-us-gov-iowa-region-is-being-retired-april-30-2020/'); // 表示したいURL
    const elm = await page.$('#main > div > div:nth-child(3) > div > div:nth-child(1)');
    if (elm !== null) {
        const data = await elm.$$eval('p, li', func);
        console.log(data);
    }
    browser.close();
}

Не могли бы вы дать мне знать, как получить доступ к внешней функции в функции обратного вызова карты?

1 Ответ

2 голосов
/ 02 мая 2019

Похоже, elm.$$eval('p, li', func) оценивает func в контексте браузера. Поэтому нет простого способа вызвать внешнюю функцию. Простым решением было бы сделать translateText внутреннюю функцию func.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...