page.evaluate等待ajax完成加载

时间:2019-06-25 14:58:24

标签: javascript node.js puppeteer

我正在用nodejs开发一个操纵up脚本。它有一个ajax来加载该脚本中的更多按钮。事实是,脚本不会等待ajax完成加载,从而离开了page.evaluate来完成脚本,而无需等待ajax完成。我对新的承诺感到困惑/等待。有人可以帮我下面的脚本吗?

var result = await page.evaluate(({ stateSearched, areaSearched, pagePaginationNo }) => {
    function processThePage(){
        var itemResult = "testing"
        return {
            itemResult
        }
    }

    function loadMore(stateSearched,areaSearched,pagePaginationNo){
        $.ajax({
            url: "ajax.php",
            type: "GET"
        }).done(function (data) {
            if (nextPage == null) {
                lastResult = processThePage()
                return lastResult
            } else {
                loadMore(stateSearched,areaSearched,pagePaginationNo+1)
            }
        });
    }  

    loadMore(stateSearched,areaSearched,2)
})

2 个答案:

答案 0 :(得分:1)

您可以传递将Promise返回到page.evaluate函数的函数,并在脚本完成后在内部调用resolve

代码示例

var result = await page.evaluate(() => new Promise(resolve => {
    // do all kind of asynchronous actions
    resolve(123);
}));
console.log(result); // 123

传递给page.evaluate的函数返回一个Promise,在继续之前,它将等待解析。因此,您可以将任何异步代码放入Promise中。代码完成后,调用resolve。您传递给resolve函数的参数将返回到脚本中。

答案 1 :(得分:0)

在研究过程中,我遇到了一个例子。这在某种程度上类似于托马斯的回答。我想获取itemResult的值。您对如何检索它们有任何想法吗?

import java.awt.EventQueue;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.prefs.Preferences;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
相关问题