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