javascript - phantom js 直到循环结束才注入(inject) javascript

标签 javascript for-loop phantomjs

我正在尝试创建虚拟网页以测试服务器上的负载平衡,我循环遍历页面元素的 100 个实例并相应地创建它。我在注入(inject) JS 时遇到困难,除了循环中的最后一个之外,它并没有对所有内容执行此操作。

for(var i=0; i<instances; i++) {
    pages.push(require('webpage').create());
}

console.log('Loading web page');
for(var i in pages) {
    pages[i].customHeaders = {
        'X-Forwarded-For': '192.111.111.'+i
    };
    var ip = '192.111.111.'+i;
    var mac = "00:00:00:00:00:"+i;
    var serial = '000000000'+i;

    console.log("Loading " + url + " in page " + i);
    pages[i].onInitialized = function() {
    if(!pages[i].injectJs("amino/VideoDisplay.js")) {
        console.log("Can not include script 'VideoDisplay.js'");
        phantom.exit(1);
    }
    if(!pages[i].injectJs("amino/TVI.js")) {
        console.log("Can not include script 'TVI.js'");
        phantom.exit(1);
    }
    if(!pages[i].injectJs("amino/PVR.js")) {
        console.log("Can not include script 'PVR.js'");
        phantom.exit(1);
    }
    if(!pages[i].injectJs("amino/CEC.js")) {
        console.log("Can not include script 'CEC.js'");
        phantom.exit(1);
    }
    if(!pages[i].injectJs("amino/Browser.js")) {
        console.log("Can not include script 'Browser.js'");
        phantom.exit(1);
    }
    if(!pages[i].injectJs("amino/AVMedia.js")) {
        console.log("Can not include script 'AVMedia.js'");
        phantom.exit(1);
    }
    if(!pages[i].injectJs("amino/AudioControl.js")) {
        console.log("Can not include script 'AudioControl.js'");
        phantom.exit(1);
    }
    if(!pages[i].injectJs("amino/ASTB.js")) {
        console.log("Can not include script 'ASTB.js'");
        phantom.exit(1);
    }
    if(!pages[i].injectJs("amino/AminoGeneric.js")) {
        console.log("Can not include script 'AminoGeneric.js'");
        phantom.exit(1);
    }

};

pages[i].viewportSize = 'width: 1280, height: 720';
    pages[i].settings.userAgent = 'Opera/9.80 (Linux sh4 ; U;  Amino; en) Presto/2.5.21 Version/10.30';
    pages[i].open(url, function () { 
    pages[i].evaluate(function(ip, mac, serial) {
        ASTB.IpAddress = ip;
        ASTB.MacAddress = mac;
        ASTB.Serial = serial
    }, ip, mac, serial);
    });
}

任何想法,我收到错误消息,指出 ASTB 变量未定义

最佳答案

你正陷入封闭陷阱。当您有一个引用循环变量的匿名函数时,它会按词法绑定(bind)到循环内该变量的值。因此,当循环变量发生变化时,匿名函数关闭的值也会发生变化,因为它指向完全相同的变量。对 .evaluate 的回调也是异步的,因此它在循环完成后运行,此时 i 指向最后一个元素。您可以使用另一个函数像这样强制作用域:

(function(i) {

   page[i].evaluate(...);

})(i);

或者你可以调用另一个函数:

evaluatePage(page, i);

...

function evaluatePage(page, i) {
    page[i].evaluate(...);
}

关于javascript - phantom js 直到循环结束才注入(inject) javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22916948/

相关文章:

javascript - 从 Backbone View 下划线模板访问模型属性

r - 如果for循环中发生错误,如何更改值?

c - 如何从一行接受一定量的输入

python - 为什么我的 Python 子进程在由 supervisord 管理时会出错?

javascript - Phantomjs Node 注入(inject)JS 中的窗口上不存在 ChaiJs

javascript - 使用 PhantomJs 登录后如何进入下一页?

javascript - 更改 w3 示例表过滤器以搜索多列

javascript - 在javascript中获取一个包含列表的对象

javascript - Webgl 没有渲染我的圈子

c - 如何使用 stdio.h 在 C 中的二维数组中记录多个最大值