Javascript可以';t将Vars/Fn传递给.evaluate()作用域(噩梦ejs)

Javascript可以';t将Vars/Fn传递给.evaluate()作用域(噩梦ejs),javascript,async-await,nightmare,Javascript,Async Await,Nightmare,我试图将一个变量传递给。求值,这样我就可以在网页范围内使用它们,但我无法让它工作 await nightmare.evaluate(function() { let links = document.querySelectorAll('div.fsl a'); return Array.prototype.map.call(links, function(e) { return e.getAttribute('href');

我试图将一个变量传递给
。求值
,这样我就可以在网页范围内使用它们,但我无法让它工作

await nightmare.evaluate(function() {
        let links = document.querySelectorAll('div.fsl a');
        return Array.prototype.map.call(links, function(e) {
            return e.getAttribute('href');
        });
    })

    .evaluate(function(result) {
        for(var i = 0; i < result.length; i++) {
            var matchResult = result[i].match(/.com\/(.*?)\?fref/);
            if (matchResult) {
                console.log(matchResult[1]);
            }
        }
    });
同样的结果。然后我试着:

const evaluated = await nightmare.evaluate(function() {
        let links = document.querySelectorAll('div.fsl a');
        return Array.prototype.map.call(links, function(e) {
            return e.getAttribute('href');
        });
    });

    await nightmare.evaluate(function(evaluated) {
        for(var i = 0; i < evaluated.length; i++) {
            var matchResult = evaluated[i].match(/.com\/(.*?)\?fref/);
            if (matchResult) {
                console.log(matchResult[1]);
            }
        }
    });
const evaluated = await nightmare.evaluate(function() {
        let links = document.querySelectorAll('div.fsl a');
        return Array.prototype.map.call(links, function(e) {
            return e.getAttribute('href');
        });
    });

for(var i = 0; i < evaluated.length; i++){
        var matchResult = evaluated[i].match(/.com\/(.*?)\?fref/);
        if(matchResult) {
            console.log(matchResult[1]);
            await nightmare.evaluate(function(matchResult) {
                return document.body.innerHTML += '<a href="https://www.example.com/'+matchResult[0]+'">'+matchResult[0]+'</a>';
            });
            await nightmare.click('a[href="https://www.example.com/'+matchResult[0]+'"]');
            await nightmare.wait(5000);
        }
    }
await nightmare.end();
哪个会将返回传递到
。然后()
,但如何将数组传递到下一个计算中?现在这是我能想到的最后一件事,但不起作用:

await nightmare.evaluate(function() {
        let links = document.querySelectorAll('div.fsl a');
        return Array.prototype.map.call(links, function(e) {
            return e.getAttribute('href');
        });
    }).evaluate((users) => {
        console.log(users);
    }).end();

我找到了一个解决方案,但它为我返回了
undefined
。我在PhantomJS中也发现了类似的东西,但还没有找到一个可行的代码。

我找到了答案。似乎我的尝试有一半是有效的,我只是没有意识到。在
.evaluate()
的范围内,我们处于浏览器范围内(如预期),但我没有考虑无法从该范围登录到控制台。具体来说,我无法登录到我的控制台。如果我从该范围运行
console.log
,它将记录到浏览器控制台。以下代码起作用:

    var foo = "stuff";
    var bar = "stuff for the remote page";

    var result = await nightmare.evaluate(function(bar2) {
        // this function executes in the remote context
        // it has access to the DOM, remote libraries, and args you pass in
        console.log("bla "+bar2); // this will not output
        // but not to outer-scope vars
        return typeof foo + " " + bar2;
    }, bar);
    console.log(result); // this logs bar2!

我想这就解决了。调试文档范围中发生的事情可能有点棘手,但肯定是可能的。

Array.prototype.forEach
返回
未定义的
。使用。什么是梦魇。评估?你所拥有的看起来不像承诺,这是
等待的
唯一可以控制的东西。我已经用一个更好的问题示例和几个我已经厌倦的代码版本更新了这个问题。我能够通过使用
Array.prototype.find
解决我之前发布的代码,但之后我必须立即编写的代码遇到了与
find
无法解决的问题相同的问题。通过多次尝试再次更新。在第一次尝试中,将第二次
.evaluate()
更改为
。然后()
具有相同的功能体。
    var foo = "stuff";
    var bar = "stuff for the remote page";

    var result = await nightmare.evaluate(function(bar2) {
        // this function executes in the remote context
        // it has access to the DOM, remote libraries, and args you pass in
        console.log("bla "+bar2); // this will not output
        // but not to outer-scope vars
        return typeof foo + " " + bar2;
    }, bar);
    console.log(result); // this logs bar2!