具有深嵌套的JS闭包

时间:2016-06-29 14:34:32

标签: javascript node.js selenium-webdriver webdriver

NPM模块有以下代码:

var actions = {};
var methods = ['POST', 'GET', 'PATCH', 'DELETE'];

methods.forEach(function(method) {
  actions['mock' + method] = function(browser, url, response) {
    browser.execute(function() {
      result[method][url] = response;
    });
  }
});

module.exports = actions;

我想要4个方法:mockPOST,mockGET,mockDELETE,mockPATCH。每个方法都应该只使用回调函数执行browser.execute,并将response放在result中相应的result['POST']字段 - mockPOST中,依此类推。但是当我执行

utils.mockPOST(browser, 'auth', {"result": "OK"});

我收到method is not defined错误。我该怎么办?谢谢!

1 个答案:

答案 0 :(得分:1)

我看到你正在为node.js使用selenium或webdriver。这让事情变得有点棘手。你不能在browser.execute函数中使用闭包,原因是它根本不会在那里运行。 Webdriver会将该函数转换为字符串,将其传输到浏览器,并在浏览器中eval该字符串。 nodejs闭包不会传递给浏览器,只会将函数代码作为字符串传递。

我认为result对象已经在浏览器中全局定义。

那么你能做些什么呢?我总是建议不要将函数文字放在browser.executebrowser.executeAsync中,因为它们令人困惑。你可以在那里放一个字符串,它将被评估。请尝试以下方法:

methods.forEach(function(method) {
  actions['mock' + method] = function(browser, url, response) {
    var browserAction = "result[" + JSON.stringify(method) + "]" +
        "[" + JSON.stringify(url) + "] = " +
        JSON.stringify(response) + ";";
    browser.execute(browserAction);
  };
});