在函数中创建全局VAR

所以我在使函数中的VAR成为全局变量时遇到了麻烦,我尝试了以下资源:

What is the scope of variables in JavaScript?

我之前的问题被标记为重复,但是在查看了上面的链接后,这对我的问题没有帮助。

这是我先前的问题:

因此,我正在使用OpenTok创建在线会议工具,并且需要从其他服务器上的API中获取会话详细信息。我在另一台服务器上创建了一个php脚本,该脚本根据URL参数提供的会话ID捕获会话信息。我知道php脚本和大多数JavaScript都可以正常工作,因为当我从解析的JSON进行console.log数据输出时,它将打印正确的信息。但是,当我尝试将变量放入凭据区域时,出现以下错误:

ReferenceError: thesession is not defined

以下是用于从单独服务器上的PHP脚本获取JSON的代码:

var url_string = window.location.href;
var url = new URL(url_string);
var session = url.searchParams.get("s");

if (session == '') {
  window.location.replace("http://www.google.com");
}

var getJSON = function(url,callback) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET',url,true);
    xhr.responseType = 'json';
    xhr.onload = function() {
      var status = xhr.status;
      if (status === 200) {
        callback(null,xhr.response);
      } else {
        callback(status,xhr.response);
      }
    };
    xhr.send();
};

getJSON('http://192.168.64.2/api/meeting/?uid=' + session,function(err,data) {
  if (err !== null) {
    console.log('Error');
  }
      var thesession = data.sessionID;
      var thetoken = data.token;
      console.log(thesession);
      console.log(thetoken);
});

let otCore;

const options = {
  credentials: {
    apiKey: "####",sessionId: thesession,token: thetoken
  },

这是控制台的屏幕截图:

在函数中创建全局VAR

最上面的控制台日志是“ thesession”,第二个控制台日志是“ thetoken”。我尝试查找该错误,但找不到与我的用法相同的错误。

期望的结果是我可以使用来自解析的JSON的数据并将结果用作凭证,例如data.sessionID,它与VAR会话绑定。

我知道这可能是一个范围问题,但是我不确定如何更改代码以使其按预期工作。

任何帮助都将不胜感激,这真的让我感到沮丧:)

如何更改范围以获取所需的功能?我已经审查了上一个问题给出的链接,但这对我的问题没有帮助。

asusxiao123 回答:在函数中创建全局VAR

var thesession = data.sessionID;

在执行上下文中定义,这是您传递给getJSON的回调函数。

朝正确方向迈出的第一步是撤消分配。在存在“会话”的范围内将“会话”分配给选项对象。

const options = {
  credentials: {
    apiKey: "####",sessionId: null,token: thetoken
  }
};

getJSON('http://192.168.64.2/api/meeting/?uid=' + session,function(err,data) {
  if (err !== null) {
    console.log('Error');
  }
      var thesession = data.sessionID;
      var thetoken = data.token;
      console.log(thesession);
      console.log(thetoken);

      options.credentials.sessionId = thesession;
});

但是,重要的是要意识到您的程序不会等待此分配。它将发送getJSON请求,然后继续处理。在getJSON调用完成并且其回调已被调用之前,您的options对象将没有sessionId。

这是深入研究Promises的好机会,它将帮助您更好地了解如何处理javascript的非阻塞性质。

,

您的问题是该行var thesession = data.sessionID的作用范围是功能function(err,data) { ... }。为了允许两个函数使用相同的变量,您需要确保未在变量无法访问的地方声明该变量。

这是两者之间的区别:

function func1() {
  var x = 3
}

function func2() {
  console.log(x)
}

func1();
func2();

这:

var x;

function func1() {
  x = 3
}

function func2() {
  console.log(x)
}

func1();
func2();

类似地,如果您在脚本的开头(或至少在其他函数之外)声明了var thesession;,则只需将其设置为thesession = data.sessionID,您的最后一部分将会有权访问您的变量thesession


修改

在上下文中:

var url_string = window.location.href;
var url = new URL(url_string);
var session = url.searchParams.get("s");
var thesession;
var thetoken;

if (session == '') {
  window.location.replace("http://www.google.com");
}

var getJSON = function(url,callback) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET',url,true);
    xhr.responseType = 'json';
    xhr.onload = function() {
      var status = xhr.status;
      if (status === 200) {
        callback(null,xhr.response);
      } else {
        callback(status,xhr.response);
      }
    };
    xhr.send();
};

getJSON('http://192.168.64.2/api/meeting/?uid=' + session,data) {
  if (err !== null) {
    console.log('Error');
  }
      thesession = data.sessionID;
      thetoken = data.token;
      console.log(thesession);
      console.log(thetoken);
});

let otCore;

const options = {
  credentials: {
    apiKey: "####",sessionId: thesession,token: thetoken
  },

作为旁注-我还建议不要使用var的{​​{1}},而要使用let的{​​{1}},这取决于您是否希望变量可变。

本文链接:https://www.f2er.com/3166967.html

大家都在问