Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 幻影闭包_Javascript_Phantomjs - Fatal编程技术网

Javascript 幻影闭包

Javascript 幻影闭包,javascript,phantomjs,Javascript,Phantomjs,我正在使用phantomJS从服务填充数据。在下面的代码中设置了sessionToken,但我无法在函数范围之外访问它。我知道我需要使用闭包,但我一直无法让它工作。如何编写闭包,以便访问作用域之外的变量 var url = "https://securitybeta.srsplatform.com/WebServices/Srs.WebPlatform.WebServices.SrswpSite.SessionTokenService.svc/JSON/ISessionTokenServiceV

我正在使用phantomJS从服务填充数据。在下面的代码中设置了sessionToken,但我无法在函数范围之外访问它。我知道我需要使用闭包,但我一直无法让它工作。如何编写闭包,以便访问作用域之外的变量

var url = "https://securitybeta.srsplatform.com/WebServices/Srs.WebPlatform.WebServices.SrswpSite.SessionTokenService.svc/JSON/ISessionTokenServiceV2/CreateSessionToken?username=srsCore&password=[redacted]";

var page = require('webpage').create();

page.onResourceError = function(resourceError) {
        console.log('Unable to load resource (#' + resourceError.id + 'URL:' + resourceError.url + ')');
        console.log('Error code: ' + resourceError.errorCode + '. Description: ' + resourceError.errorString);
};

var sessionToken = 0;

var getSessionToken = page.open(url, 'get', function(status) {
    sessionToken = page.plainText;
    sessionToken = JSON.parse(sessionToken);
    sessionToken = sessionToken.Item.AuthorizedSessionToken;

    console.log('Status: ' + status + ' sessionToken = ' + sessionToken);
    //console.log(sessionToken);
    return function () {
        return sessionToken;
    }

});
sessionToken = getSessionToken();
console.log('sessionToken outside of function scope: ' + sessionToken);
sessionToken将在以下代码中使用:

 var webPage = require('webpage');
var vehiclePage = webPage.create();
var settings = {
    operation: "POST",
    encoding: "utf8",
    headers: {
        "Content-Type": "application/json"
    },
    data: JSON.stringify({
        "VIN": "JF2SJAAC5EG432990",
        "StandardIds": null,
        "LicenseCountry": null,
        "LicensePlate": "334 142",
        "LicenseState": "UT",
        "OdometerUnitOfMeasure": 0,
        "UnitNumber": null,
        "Year": 1994,
        "Make": "Chevrolet",
        "Model": "Camaro",
        "Engine": null,
        "Color": null,
        "Description": null
    })
};

vehiclePage.onResourceError = function(resourceError) {
    console.log('Unable to load resource (#' + resourceError.id + 'URL:' + resourceError.url + ')');
    console.log('Error code: ' + resourceError.errorCode + '. Description: ' + resourceError.errorString);
};

vehiclePage.open("https://ws-smsbeta.srsplatform.com/api/v1/Vehicle/Save?sessionToken=" + sessionToken + "&shopId=" + SHOP_ID, settings, function(status) {
    var vehicleGuid = vehiclePage.plainText;
    console.log('Status: ' + status + " " + vehicleGuid);
    phantom.exit();
});

首先,如果要在annonymous函数之外使用该变量,必须先声明它

var sessionToken = {};

page.open(url, 'get', function(status) {
    sessionToken = page.plainText;
    sessionToken = JSON.parse(sessionToken);
    sessionToken = sessionToken.Item.AuthorizedSessionToken;

    console.log('Status: ' + status + ' sessionToken = ' + sessionToken);
    //console.log(sessionToken);

});

console.log('sessionToken outside of function scope: ' + sessionToken);
但是您必须了解
page.open
方法是异步的,上面代码的最后一行将在传递给它的annonymous函数的第一行之前执行。该函数只有在获得url后才会调用,因此,您可以使用它的
.plainText

如果在调用
page.open
方法后尝试在函数外部使用
.plainText
,则在尚未加载该方法时,也会遇到同样的问题


更新

编辑后,必须将其他代码放入函数中,例如:

function loadVehicle(sessionToken) {
  var webPage = require('webpage');
  var vehiclePage = webPage.create();
  var settings = {
      operation: "POST",
      encoding: "utf8",
      headers: {
          "Content-Type": "application/json"
      },
      data: JSON.stringify({
          "VIN": "JF2SJAAC5EG432990",
          "StandardIds": null,
          "LicenseCountry": null,
          "LicensePlate": "334 142",
          "LicenseState": "UT",
          "OdometerUnitOfMeasure": 0,
          "UnitNumber": null,
          "Year": 1994,
          "Make": "Chevrolet",
          "Model": "Camaro",
          "Engine": null,
          "Color": null,
          "Description": null
      })
  };

  vehiclePage.onResourceError = function(resourceError) {
      console.log('Unable to load resource (#' + resourceError.id + 'URL:' + resourceError.url + ')');
      console.log('Error code: ' + resourceError.errorCode + '. Description: ' + resourceError.errorString);
  };

  vehiclePage.open("https://ws-smsbeta.srsplatform.com/api/v1/Vehicle/Save?sessionToken=" + sessionToken + "&shopId=" + SHOP_ID, settings, function(status) {
      var vehicleGuid = vehiclePage.plainText;
      console.log('Status: ' + status + " " + vehicleGuid);
      phantom.exit();
  });
}
然后,在传递到
页面的annonymous函数中。打开
方法:

page.open(url, 'get', function(status) {
    sessionToken = page.plainText;
    sessionToken = JSON.parse(sessionToken);
    sessionToken = sessionToken.Item.AuthorizedSessionToken;
    loadVehicle(sessionToken);
});

要么我遗漏了什么,要么我在这里说明了明显的问题,但是,您是否尝试将sessionToken设置在页面外部。open的回调?将其设置在页面外部。open不起作用。相关:回答:不可能。请查看我的编辑。我不确定如何集成您的解决方案。@webdev5我无法理解您的编辑。请复制您的完整代码,并向我们展示您试图实现的目标,这样我就可以帮助您解决具体问题。好吗?出于安全原因,我不得不修改密码。@webdev5您的代码仍然没有显示任何内容。为什么必须在闭包之外使用
sessionToken
?您没有粘贴显示您希望如何使用它的代码。