2017-01-18 7 views
0

, поэтому Im в настоящее время работает над программой, которая работает с api.JavaScript - Невозможно получить данные из функции onload (http-запрос)

У меня есть две функции атм:

getBotID()

function getBotID(domain) { 
    var url = "http://" + domain + ":8087/api/v1/botId"; 
    idRequest.open("GET", url); 
    idRequest.onload = function() { 
     var botID = JSON.parse(idRequest.responseText); 
    }; 
    idRequest.send(); 
} 

и getAuth()

function getAuth(domain, user, pass) { 
    getBotID(domain); 

    var url = "http://" + domain + ":8087/api/v1/bot/login"; 
    body = '{"username": ' + user + ', "password": ' + pass + ', "botId": ' + botID + '}'; 
    authRequest.open("POST", url); 
    authRequest.setRequestHeader("Content-Type", "application/json"); 
    authRequest.onload = function() { 
     var authToken = JSON.parse(authRequest.responseText); 
    }; 
    authRequest.send(JSON.stringify(body)); 
} 

Я должен получить botID прежде, чем я могу попытаться получить новый AuthToken поэтому я немедленно вызываю getBotID() в функции getAuth().

Моя проблема: я не могу получить botID вне функции OnLoad() запроса HTTP в getBotID(), так как он будет работать так:

  1. начала getAuth()
  2. начать getBotID()
  3. отделка getBotID()
  4. отделка getAuth()
  5. И ТЕПЕРЬ закончить функцию OnLoad в getBotID() ...

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

+0

Вы не можете этого сделать. Вы должны использовать обещания. – SLaks

+0

Не создавайте JSON вручную. Используйте 'JSON.stringify'. – SLaks

+0

@SLaks Вы имеете в виду переменную тела? – redii

ответ

1

Я думаю, что это сработает. Передает анонимную функцию getBotId и он назвал это обратно после того, как ваш первый запрос завершен:

function getBotID(domain, callback) { 
    var url = "http://" + domain + ":8087/api/v1/botId"; 
    idRequest.open("GET", url); 
    idRequest.onload = callback; 
    idRequest.send(); 
} 

function getAuth(domain, user, pass) { 
    getBotID(domain, function() { 
    var botID = JSON.parse(this.responseText); 
    var url = "http://" + domain + ":8087/api/v1/bot/login"; 
    body = '{"username": ' + user + ', "password": ' + pass + ', "botId": ' + botID + '}'; 
    authRequest.open("POST", url); 
    authRequest.setRequestHeader("Content-Type", "application/json"); 
    authRequest.onload = function() { 
     var authToken = JSON.parse(authRequest.responseText); 
    }; 
    authRequest.send(JSON.stringify(body)); 
    }); 
} 
+0

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

0

Так самый простой способ добавить «ложный» параметр в getBotIDs idRequest.open функции(). Это приведет к синхронному коду, и функция onload() будет завершена до того, как остальная часть кода будет работать.

+0

Не делайте этого; что полностью заморозит браузер. – SLaks

+0

Хмм, я не тестировал это пока, но Im работает с Electron, и, возможно, я могу просто запустить новое окно после «экрана входа». – redii

+0

Нет. Вам нужно научиться писать асинхронный код. Читайте http://blog.slaks.net/2015-01-04/async-method-patterns/ – SLaks

 Смежные вопросы

  • Нет связанных вопросов^_^