2017-01-18 8 views
0

これは現在、APIを使用しているプログラマーで作業しています。JavaScript - オンロード機能(httpリクエスト)からデータを取得する

私は2つの機能は、ATMがあります

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)); 
} 

私は新しい持つAuthTokenを取得しようとする前に、BOTIDを取得する必要がありますgetAuth()関数でgetBotID()を即座に呼び出します。

私の問題は、次のとおりです。

  1. 開始getAuthを()
  2. を:それはこのように実行されますので、私は)getBotID(でhttpリクエストののonload()関数の外側BOTIDを得るカント開始getBotID()
  3. 仕上げgetBotID()
  4. 仕上げgetAuth()
  5. AND NOW getBotID()のonloadイベント機能を終える...

私は単にonload関数からbotIDデータを取得できません。私はすでにあなたにコールバック関数を試しましたが、それはうまく機能しませんでした。

+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

ええと私はこれまでのところ、私はElectronと一緒に働いていたが、 "Login Screen"の後に新しいウィンドウを立ち上げることができます。 – redii

+0

いいえ非同期コードを書く方法を学ぶ必要があります。 http://blog.slaks.net/2015-01-04/async-method-patterns/を読んでください。 – SLaks

関連する問題