Создание глобального VAR в функциях - PullRequest
0 голосов
/ 04 ноября 2019

Итак, у меня возникли проблемы с получением VAR-функции в глобальной функции, я пробовал следующие ресурсы:

Какова область видимости переменных в JavaScript?

Мой предыдущий вопрос был помечен как дубликат, но после просмотра ссылки выше он не помог с моей проблемой.

Вот мой предыдущий вопрос:

Поэтому я использую OpenTok для создания онлайн-инструмента для конференций, и мне нужно получить информацию о сеансе из API на другом сервере. Я создал скрипт php на другом сервере, который получает информацию о сеансе на основе идентификатора сеанса, предоставленного параметром URL. Я знаю, что скрипт php и большая часть JavaScript работают правильно, потому что, когда я пытаюсь получить данные console.log из проанализированного JSON, он выводит правильную информацию. Однако, когда я пытаюсь поместить переменные в область учетных данных, я получаю следующую ошибку:

ReferenceError: thesession is not defined

Вот код, используемый для получения JSON из сценария PHP на отдельном сервере:

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
  },

А вот скриншот консоли:

console

Верхний журнал консоли - "thisssion" иВторой консольный журнал - "токен". Я попытался найти ошибку, но не могу найти такую ​​же, как у меня.

Желаемым результатом было бы то, что я мог бы использовать данные из проанализированного JSON и использовать результат в качестве учетных данных, напримерdata.sessionID, который связан с этой VAR-версией.

Я знаю, что это может быть проблемой области действия, но я не уверен, как я мог бы изменить код, чтобы заставить его работать как задумано.

Любая помощь будет высоко ценится, эта действительно поставила меня в тупик:)

Как бы я изменил область видимости, чтобы получить желаемую функцию? Я просмотрел ссылку, которая была дана на предыдущий вопрос, но это не помогло мне с моей проблемой.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

var thesession = data.sessionID;

Определяется в контексте его выполнения, который является функцией обратного вызова, которую вы передали getJSON.

Один шаг в правильном направлении - отменить назначение. Присвойте 'thesession' объекту параметров в области действия, в которой существует 'thesession'.

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, а затем продолжит обработку. Ваш объект параметров не будет иметь sessionId до тех пор, пока не завершится вызов getJSON и не будет вызван его обратный вызов.

Это была бы хорошая возможность углубиться в Promises, что поможет вам лучше понять, как обрабатыватьблокирующий характер javascript.

0 голосов
/ 04 ноября 2019

Ваша проблема в том, что эта строка 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,
function(err, 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, а вместо этого просто использовать let из const, в зависимости от того, хотите ли вы, чтобы ваша переменная была изменяемой или нет.

...