QA@IT
«回答へ戻る

"非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。"ではなく「xhr.onload のところに書いているreturnはあくまで xhr.onloadのreturnですのでxhrStartの戻り値にはなりません。」であるとご指摘を頂きました。

7
 console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
 
 ```
-書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。またDOMParserやJsonParserやjQuery.parseHTMLなどを使用するとデバイスに依存するかもしれないのでXMLHttpRequestだけで完結させたいのですが、もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。
+書きたかったのですが、xhr.onload のところに書いているreturnはあくまで xhr.onloadのreturnですのでxhrStartの戻り値にはなりません。またDOMParserやJsonParserやjQuery.parseHTMLなどを使用するとデバイスに依存するかもしれないのでXMLHttpRequestだけで完結させたいのですが、もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。
function xhrStart(method,url,data){
    var xhr = new XMLHttpRequest();
    xhr.onload = function(){
        var document = xhr.response;
        var element = document.getElementById("toptxt");
        console.log(element.innerHTML);
        var childElement = element.getElementsByTagName("a");
        console.log(childElement[0].href);
        var innerXhr = new XMLHttpRequest();
        innerXhr.onload = function(){
            var innerDocument = innerXhr.response;
            var innerElement = innerDocument.getElementsByTagName("a");
            console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
            var innerInnerXhr = new XMLHttpRequest();
            innerInnerXhr.onload = function(){
                var innerInnerDocument = innerInnerXhr.response;
                var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
                console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
                //
                //ネストが続く…
                //
            }
            innerInnerXhr.open('GET','http://allow-any-origin.appspot.com/' + innerElement[Math.floor(Math.random() * innerElement.length)].href);
            innerInnerXhr.responseType = "document";
            innerInnerXhr.send(data);
        }
        innerXhr.open('GET','http://allow-any-origin.appspot.com/' + childElement[0].href);
        innerXhr.responseType = "document";
        innerXhr.send(data);
    }
    xhr.open(method,url);
    xhr.responseType = "document";
    xhr.send(data);
}

xhrStart('GET','http://www.yahoo.co.jp/',null);

この質問は最初上記のように(一応、動きます(http://www.yahoo.co.jp/のドメイン下でコンソールを使ってください。))書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)

function xhrStart(method,url,data){
    var xhr = new XMLHttpRequest();
    xhr.onload = function(){
        var document = xhr.response;
        return document;
    }
    xhr.open(method,'http://allow-any-origin.appspot.com/' + url);
    xhr.responseType = "document";
    xhr.send(data);
}

var document = xhrStart('GET','http://www.yahoo.co.jp/',null);
var element = document.getElementById("toptxt");
console.log(element.innerHTML);
var childElement = element.getElementsByTagName("a");
console.log(childElement[0].href);

var innerDocument = xhrStart('GET',childElement[0].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);

書きたかったのですが、xhr.onload のところに書いているreturnはあくまで xhr.onloadのreturnですのでxhrStartの戻り値にはなりません。またDOMParserやJsonParserやjQuery.parseHTMLなどを使用するとデバイスに依存するかもしれないのでXMLHttpRequestだけで完結させたいのですが、もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。

```javascript
function xhrStart(method,url,data){
	var xhr = new XMLHttpRequest();
	xhr.onload = function(){
		var document = xhr.response;
		var element = document.getElementById("toptxt");
		console.log(element.innerHTML);
		var childElement = element.getElementsByTagName("a");
		console.log(childElement[0].href);
		var innerXhr = new XMLHttpRequest();
		innerXhr.onload = function(){
			var innerDocument = innerXhr.response;
			var innerElement = innerDocument.getElementsByTagName("a");
			console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
			var innerInnerXhr = new XMLHttpRequest();
			innerInnerXhr.onload = function(){
				var innerInnerDocument = innerInnerXhr.response;
				var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
				console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
				//
				//ネストが続く…
				//
			}
			innerInnerXhr.open('GET','http://allow-any-origin.appspot.com/' + innerElement[Math.floor(Math.random() * innerElement.length)].href);
			innerInnerXhr.responseType = "document";
			innerInnerXhr.send(data);
		}
		innerXhr.open('GET','http://allow-any-origin.appspot.com/' + childElement[0].href);
		innerXhr.responseType = "document";
		innerXhr.send(data);
	}
	xhr.open(method,url);
	xhr.responseType = "document";
	xhr.send(data);
}

xhrStart('GET','http://www.yahoo.co.jp/',null);
```
この質問は最初上記のように(一応、動きます([http://www.yahoo.co.jp/](http://www.yahoo.co.jp/)のドメイン下でコンソールを使ってください。))書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)
```javascript
function xhrStart(method,url,data){
	var xhr = new XMLHttpRequest();
	xhr.onload = function(){
		var document = xhr.response;
		return document;
	}
	xhr.open(method,'http://allow-any-origin.appspot.com/' + url);
	xhr.responseType = "document";
	xhr.send(data);
}

var document = xhrStart('GET','http://www.yahoo.co.jp/',null);
var element = document.getElementById("toptxt");
console.log(element.innerHTML);
var childElement = element.getElementsByTagName("a");
console.log(childElement[0].href);

var innerDocument = xhrStart('GET',childElement[0].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);

```
書きたかったのですが、xhr.onload のところに書いているreturnはあくまで xhr.onloadのreturnですのでxhrStartの戻り値にはなりません。またDOMParserやJsonParserやjQuery.parseHTMLなどを使用するとデバイスに依存するかもしれないのでXMLHttpRequestだけで完結させたいのですが、もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。

編集ばかりしてすいません。

7
 
 var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
 var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
-console.log(innerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
+console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
 
 ```
 書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。またDOMParserやJsonParserやjQuery.parseHTMLなどを使用するとデバイスに依存するかもしれないのでXMLHttpRequestだけで完結させたいのですが、もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。
function xhrStart(method,url,data){
    var xhr = new XMLHttpRequest();
    xhr.onload = function(){
        var document = xhr.response;
        var element = document.getElementById("toptxt");
        console.log(element.innerHTML);
        var childElement = element.getElementsByTagName("a");
        console.log(childElement[0].href);
        var innerXhr = new XMLHttpRequest();
        innerXhr.onload = function(){
            var innerDocument = innerXhr.response;
            var innerElement = innerDocument.getElementsByTagName("a");
            console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
            var innerInnerXhr = new XMLHttpRequest();
            innerInnerXhr.onload = function(){
                var innerInnerDocument = innerInnerXhr.response;
                var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
                console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
                //
                //ネストが続く…
                //
            }
            innerInnerXhr.open('GET','http://allow-any-origin.appspot.com/' + innerElement[Math.floor(Math.random() * innerElement.length)].href);
            innerInnerXhr.responseType = "document";
            innerInnerXhr.send(data);
        }
        innerXhr.open('GET','http://allow-any-origin.appspot.com/' + childElement[0].href);
        innerXhr.responseType = "document";
        innerXhr.send(data);
    }
    xhr.open(method,url);
    xhr.responseType = "document";
    xhr.send(data);
}

xhrStart('GET','http://www.yahoo.co.jp/',null);

この質問は最初上記のように(一応、動きます(http://www.yahoo.co.jp/のドメイン下でコンソールを使ってください。))書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)

function xhrStart(method,url,data){
    var xhr = new XMLHttpRequest();
    xhr.onload = function(){
        var document = xhr.response;
        return document;
    }
    xhr.open(method,'http://allow-any-origin.appspot.com/' + url);
    xhr.responseType = "document";
    xhr.send(data);
}

var document = xhrStart('GET','http://www.yahoo.co.jp/',null);
var element = document.getElementById("toptxt");
console.log(element.innerHTML);
var childElement = element.getElementsByTagName("a");
console.log(childElement[0].href);

var innerDocument = xhrStart('GET',childElement[0].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);

書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。またDOMParserやJsonParserやjQuery.parseHTMLなどを使用するとデバイスに依存するかもしれないのでXMLHttpRequestだけで完結させたいのですが、もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。

```javascript
function xhrStart(method,url,data){
	var xhr = new XMLHttpRequest();
	xhr.onload = function(){
		var document = xhr.response;
		var element = document.getElementById("toptxt");
		console.log(element.innerHTML);
		var childElement = element.getElementsByTagName("a");
		console.log(childElement[0].href);
		var innerXhr = new XMLHttpRequest();
		innerXhr.onload = function(){
			var innerDocument = innerXhr.response;
			var innerElement = innerDocument.getElementsByTagName("a");
			console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
			var innerInnerXhr = new XMLHttpRequest();
			innerInnerXhr.onload = function(){
				var innerInnerDocument = innerInnerXhr.response;
				var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
				console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
				//
				//ネストが続く…
				//
			}
			innerInnerXhr.open('GET','http://allow-any-origin.appspot.com/' + innerElement[Math.floor(Math.random() * innerElement.length)].href);
			innerInnerXhr.responseType = "document";
			innerInnerXhr.send(data);
		}
		innerXhr.open('GET','http://allow-any-origin.appspot.com/' + childElement[0].href);
		innerXhr.responseType = "document";
		innerXhr.send(data);
	}
	xhr.open(method,url);
	xhr.responseType = "document";
	xhr.send(data);
}

xhrStart('GET','http://www.yahoo.co.jp/',null);
```
この質問は最初上記のように(一応、動きます([http://www.yahoo.co.jp/](http://www.yahoo.co.jp/)のドメイン下でコンソールを使ってください。))書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)
```javascript
function xhrStart(method,url,data){
	var xhr = new XMLHttpRequest();
	xhr.onload = function(){
		var document = xhr.response;
		return document;
	}
	xhr.open(method,'http://allow-any-origin.appspot.com/' + url);
	xhr.responseType = "document";
	xhr.send(data);
}

var document = xhrStart('GET','http://www.yahoo.co.jp/',null);
var element = document.getElementById("toptxt");
console.log(element.innerHTML);
var childElement = element.getElementsByTagName("a");
console.log(childElement[0].href);

var innerDocument = xhrStart('GET',childElement[0].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);

```
書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。またDOMParserやJsonParserやjQuery.parseHTMLなどを使用するとデバイスに依存するかもしれないのでXMLHttpRequestだけで完結させたいのですが、もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。

7
 console.log(innerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
 
 ```
-書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。
+書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。またDOMParserやJsonParserやjQuery.parseHTMLなどを使用するとデバイスに依存するかもしれないのでXMLHttpRequestだけで完結させたいのですが、もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。
function xhrStart(method,url,data){
    var xhr = new XMLHttpRequest();
    xhr.onload = function(){
        var document = xhr.response;
        var element = document.getElementById("toptxt");
        console.log(element.innerHTML);
        var childElement = element.getElementsByTagName("a");
        console.log(childElement[0].href);
        var innerXhr = new XMLHttpRequest();
        innerXhr.onload = function(){
            var innerDocument = innerXhr.response;
            var innerElement = innerDocument.getElementsByTagName("a");
            console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
            var innerInnerXhr = new XMLHttpRequest();
            innerInnerXhr.onload = function(){
                var innerInnerDocument = innerInnerXhr.response;
                var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
                console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
                //
                //ネストが続く…
                //
            }
            innerInnerXhr.open('GET','http://allow-any-origin.appspot.com/' + innerElement[Math.floor(Math.random() * innerElement.length)].href);
            innerInnerXhr.responseType = "document";
            innerInnerXhr.send(data);
        }
        innerXhr.open('GET','http://allow-any-origin.appspot.com/' + childElement[0].href);
        innerXhr.responseType = "document";
        innerXhr.send(data);
    }
    xhr.open(method,url);
    xhr.responseType = "document";
    xhr.send(data);
}

xhrStart('GET','http://www.yahoo.co.jp/',null);

この質問は最初上記のように(一応、動きます(http://www.yahoo.co.jp/のドメイン下でコンソールを使ってください。))書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)

function xhrStart(method,url,data){
    var xhr = new XMLHttpRequest();
    xhr.onload = function(){
        var document = xhr.response;
        return document;
    }
    xhr.open(method,'http://allow-any-origin.appspot.com/' + url);
    xhr.responseType = "document";
    xhr.send(data);
}

var document = xhrStart('GET','http://www.yahoo.co.jp/',null);
var element = document.getElementById("toptxt");
console.log(element.innerHTML);
var childElement = element.getElementsByTagName("a");
console.log(childElement[0].href);

var innerDocument = xhrStart('GET',childElement[0].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerInnerElement.length)].href);

書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。またDOMParserやJsonParserやjQuery.parseHTMLなどを使用するとデバイスに依存するかもしれないのでXMLHttpRequestだけで完結させたいのですが、もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。

```javascript
function xhrStart(method,url,data){
	var xhr = new XMLHttpRequest();
	xhr.onload = function(){
		var document = xhr.response;
		var element = document.getElementById("toptxt");
		console.log(element.innerHTML);
		var childElement = element.getElementsByTagName("a");
		console.log(childElement[0].href);
		var innerXhr = new XMLHttpRequest();
		innerXhr.onload = function(){
			var innerDocument = innerXhr.response;
			var innerElement = innerDocument.getElementsByTagName("a");
			console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
			var innerInnerXhr = new XMLHttpRequest();
			innerInnerXhr.onload = function(){
				var innerInnerDocument = innerInnerXhr.response;
				var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
				console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
				//
				//ネストが続く…
				//
			}
			innerInnerXhr.open('GET','http://allow-any-origin.appspot.com/' + innerElement[Math.floor(Math.random() * innerElement.length)].href);
			innerInnerXhr.responseType = "document";
			innerInnerXhr.send(data);
		}
		innerXhr.open('GET','http://allow-any-origin.appspot.com/' + childElement[0].href);
		innerXhr.responseType = "document";
		innerXhr.send(data);
	}
	xhr.open(method,url);
	xhr.responseType = "document";
	xhr.send(data);
}

xhrStart('GET','http://www.yahoo.co.jp/',null);
```
この質問は最初上記のように(一応、動きます([http://www.yahoo.co.jp/](http://www.yahoo.co.jp/)のドメイン下でコンソールを使ってください。))書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)
```javascript
function xhrStart(method,url,data){
	var xhr = new XMLHttpRequest();
	xhr.onload = function(){
		var document = xhr.response;
		return document;
	}
	xhr.open(method,'http://allow-any-origin.appspot.com/' + url);
	xhr.responseType = "document";
	xhr.send(data);
}

var document = xhrStart('GET','http://www.yahoo.co.jp/',null);
var element = document.getElementById("toptxt");
console.log(element.innerHTML);
var childElement = element.getElementsByTagName("a");
console.log(childElement[0].href);

var innerDocument = xhrStart('GET',childElement[0].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerInnerElement.length)].href);

```
書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。またDOMParserやJsonParserやjQuery.parseHTMLなどを使用するとデバイスに依存するかもしれないのでXMLHttpRequestだけで完結させたいのですが、もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。

7
 console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
 
 var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
-var innerElement = innerDocument.getElementsByTagName("a");
-console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
+var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
+console.log(innerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
 
 ```
 書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。
function xhrStart(method,url,data){
    var xhr = new XMLHttpRequest();
    xhr.onload = function(){
        var document = xhr.response;
        var element = document.getElementById("toptxt");
        console.log(element.innerHTML);
        var childElement = element.getElementsByTagName("a");
        console.log(childElement[0].href);
        var innerXhr = new XMLHttpRequest();
        innerXhr.onload = function(){
            var innerDocument = innerXhr.response;
            var innerElement = innerDocument.getElementsByTagName("a");
            console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
            var innerInnerXhr = new XMLHttpRequest();
            innerInnerXhr.onload = function(){
                var innerInnerDocument = innerInnerXhr.response;
                var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
                console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
                //
                //ネストが続く…
                //
            }
            innerInnerXhr.open('GET','http://allow-any-origin.appspot.com/' + innerElement[Math.floor(Math.random() * innerElement.length)].href);
            innerInnerXhr.responseType = "document";
            innerInnerXhr.send(data);
        }
        innerXhr.open('GET','http://allow-any-origin.appspot.com/' + childElement[0].href);
        innerXhr.responseType = "document";
        innerXhr.send(data);
    }
    xhr.open(method,url);
    xhr.responseType = "document";
    xhr.send(data);
}

xhrStart('GET','http://www.yahoo.co.jp/',null);

この質問は最初上記のように(一応、動きます(http://www.yahoo.co.jp/のドメイン下でコンソールを使ってください。))書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)

function xhrStart(method,url,data){
    var xhr = new XMLHttpRequest();
    xhr.onload = function(){
        var document = xhr.response;
        return document;
    }
    xhr.open(method,'http://allow-any-origin.appspot.com/' + url);
    xhr.responseType = "document";
    xhr.send(data);
}

var document = xhrStart('GET','http://www.yahoo.co.jp/',null);
var element = document.getElementById("toptxt");
console.log(element.innerHTML);
var childElement = element.getElementsByTagName("a");
console.log(childElement[0].href);

var innerDocument = xhrStart('GET',childElement[0].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerInnerElement.length)].href);

書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。

```javascript
function xhrStart(method,url,data){
	var xhr = new XMLHttpRequest();
	xhr.onload = function(){
		var document = xhr.response;
		var element = document.getElementById("toptxt");
		console.log(element.innerHTML);
		var childElement = element.getElementsByTagName("a");
		console.log(childElement[0].href);
		var innerXhr = new XMLHttpRequest();
		innerXhr.onload = function(){
			var innerDocument = innerXhr.response;
			var innerElement = innerDocument.getElementsByTagName("a");
			console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
			var innerInnerXhr = new XMLHttpRequest();
			innerInnerXhr.onload = function(){
				var innerInnerDocument = innerInnerXhr.response;
				var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
				console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
				//
				//ネストが続く…
				//
			}
			innerInnerXhr.open('GET','http://allow-any-origin.appspot.com/' + innerElement[Math.floor(Math.random() * innerElement.length)].href);
			innerInnerXhr.responseType = "document";
			innerInnerXhr.send(data);
		}
		innerXhr.open('GET','http://allow-any-origin.appspot.com/' + childElement[0].href);
		innerXhr.responseType = "document";
		innerXhr.send(data);
	}
	xhr.open(method,url);
	xhr.responseType = "document";
	xhr.send(data);
}

xhrStart('GET','http://www.yahoo.co.jp/',null);
```
この質問は最初上記のように(一応、動きます([http://www.yahoo.co.jp/](http://www.yahoo.co.jp/)のドメイン下でコンソールを使ってください。))書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)
```javascript
function xhrStart(method,url,data){
	var xhr = new XMLHttpRequest();
	xhr.onload = function(){
		var document = xhr.response;
		return document;
	}
	xhr.open(method,'http://allow-any-origin.appspot.com/' + url);
	xhr.responseType = "document";
	xhr.send(data);
}

var document = xhrStart('GET','http://www.yahoo.co.jp/',null);
var element = document.getElementById("toptxt");
console.log(element.innerHTML);
var childElement = element.getElementsByTagName("a");
console.log(childElement[0].href);

var innerDocument = xhrStart('GET',childElement[0].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerInnerElement.length)].href);

```
書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。

7
 var innerElement = innerDocument.getElementsByTagName("a");
 console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
 
-var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
-var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
-console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
 ```
 書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。
function xhrStart(method,url,data){
    var xhr = new XMLHttpRequest();
    xhr.onload = function(){
        var document = xhr.response;
        var element = document.getElementById("toptxt");
        console.log(element.innerHTML);
        var childElement = element.getElementsByTagName("a");
        console.log(childElement[0].href);
        var innerXhr = new XMLHttpRequest();
        innerXhr.onload = function(){
            var innerDocument = innerXhr.response;
            var innerElement = innerDocument.getElementsByTagName("a");
            console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
            var innerInnerXhr = new XMLHttpRequest();
            innerInnerXhr.onload = function(){
                var innerInnerDocument = innerInnerXhr.response;
                var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
                console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
                //
                //ネストが続く…
                //
            }
            innerInnerXhr.open('GET','http://allow-any-origin.appspot.com/' + innerElement[Math.floor(Math.random() * innerElement.length)].href);
            innerInnerXhr.responseType = "document";
            innerInnerXhr.send(data);
        }
        innerXhr.open('GET','http://allow-any-origin.appspot.com/' + childElement[0].href);
        innerXhr.responseType = "document";
        innerXhr.send(data);
    }
    xhr.open(method,url);
    xhr.responseType = "document";
    xhr.send(data);
}

xhrStart('GET','http://www.yahoo.co.jp/',null);

この質問は最初上記のように(一応、動きます(http://www.yahoo.co.jp/のドメイン下でコンソールを使ってください。))書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)

function xhrStart(method,url,data){
    var xhr = new XMLHttpRequest();
    xhr.onload = function(){
        var document = xhr.response;
        return document;
    }
    xhr.open(method,'http://allow-any-origin.appspot.com/' + url);
    xhr.responseType = "document";
    xhr.send(data);
}

var document = xhrStart('GET','http://www.yahoo.co.jp/',null);
var element = document.getElementById("toptxt");
console.log(element.innerHTML);
var childElement = element.getElementsByTagName("a");
console.log(childElement[0].href);

var innerDocument = xhrStart('GET',childElement[0].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。

```javascript
function xhrStart(method,url,data){
	var xhr = new XMLHttpRequest();
	xhr.onload = function(){
		var document = xhr.response;
		var element = document.getElementById("toptxt");
		console.log(element.innerHTML);
		var childElement = element.getElementsByTagName("a");
		console.log(childElement[0].href);
		var innerXhr = new XMLHttpRequest();
		innerXhr.onload = function(){
			var innerDocument = innerXhr.response;
			var innerElement = innerDocument.getElementsByTagName("a");
			console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
			var innerInnerXhr = new XMLHttpRequest();
			innerInnerXhr.onload = function(){
				var innerInnerDocument = innerInnerXhr.response;
				var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
				console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
				//
				//ネストが続く…
				//
			}
			innerInnerXhr.open('GET','http://allow-any-origin.appspot.com/' + innerElement[Math.floor(Math.random() * innerElement.length)].href);
			innerInnerXhr.responseType = "document";
			innerInnerXhr.send(data);
		}
		innerXhr.open('GET','http://allow-any-origin.appspot.com/' + childElement[0].href);
		innerXhr.responseType = "document";
		innerXhr.send(data);
	}
	xhr.open(method,url);
	xhr.responseType = "document";
	xhr.send(data);
}

xhrStart('GET','http://www.yahoo.co.jp/',null);
```
この質問は最初上記のように(一応、動きます([http://www.yahoo.co.jp/](http://www.yahoo.co.jp/)のドメイン下でコンソールを使ってください。))書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)
```javascript
function xhrStart(method,url,data){
	var xhr = new XMLHttpRequest();
	xhr.onload = function(){
		var document = xhr.response;
		return document;
	}
	xhr.open(method,'http://allow-any-origin.appspot.com/' + url);
	xhr.responseType = "document";
	xhr.send(data);
}

var document = xhrStart('GET','http://www.yahoo.co.jp/',null);
var element = document.getElementById("toptxt");
console.log(element.innerHTML);
var childElement = element.getElementsByTagName("a");
console.log(childElement[0].href);

var innerDocument = xhrStart('GET',childElement[0].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

```
書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。

7
 
 xhrStart('GET','http://www.yahoo.co.jp/',null);
 ```
-この質問は最初上記のように(一応、動きます)書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)
+この質問は最初上記のように(一応、動きます([http://www.yahoo.co.jp/](http://www.yahoo.co.jp/)のドメイン下でコンソールを使ってください。))書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)
 ```javascript
 function xhrStart(method,url,data){
 	var xhr = new XMLHttpRequest();
function xhrStart(method,url,data){
    var xhr = new XMLHttpRequest();
    xhr.onload = function(){
        var document = xhr.response;
        var element = document.getElementById("toptxt");
        console.log(element.innerHTML);
        var childElement = element.getElementsByTagName("a");
        console.log(childElement[0].href);
        var innerXhr = new XMLHttpRequest();
        innerXhr.onload = function(){
            var innerDocument = innerXhr.response;
            var innerElement = innerDocument.getElementsByTagName("a");
            console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
            var innerInnerXhr = new XMLHttpRequest();
            innerInnerXhr.onload = function(){
                var innerInnerDocument = innerInnerXhr.response;
                var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
                console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
                //
                //ネストが続く…
                //
            }
            innerInnerXhr.open('GET','http://allow-any-origin.appspot.com/' + innerElement[Math.floor(Math.random() * innerElement.length)].href);
            innerInnerXhr.responseType = "document";
            innerInnerXhr.send(data);
        }
        innerXhr.open('GET','http://allow-any-origin.appspot.com/' + childElement[0].href);
        innerXhr.responseType = "document";
        innerXhr.send(data);
    }
    xhr.open(method,url);
    xhr.responseType = "document";
    xhr.send(data);
}

xhrStart('GET','http://www.yahoo.co.jp/',null);

この質問は最初上記のように(一応、動きます(http://www.yahoo.co.jp/のドメイン下でコンソールを使ってください。))書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)

function xhrStart(method,url,data){
    var xhr = new XMLHttpRequest();
    xhr.onload = function(){
        var document = xhr.response;
        return document;
    }
    xhr.open(method,'http://allow-any-origin.appspot.com/' + url);
    xhr.responseType = "document";
    xhr.send(data);
}

var document = xhrStart('GET','http://www.yahoo.co.jp/',null);
var element = document.getElementById("toptxt");
console.log(element.innerHTML);
var childElement = element.getElementsByTagName("a");
console.log(childElement[0].href);

var innerDocument = xhrStart('GET',childElement[0].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);

書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。

```javascript
function xhrStart(method,url,data){
	var xhr = new XMLHttpRequest();
	xhr.onload = function(){
		var document = xhr.response;
		var element = document.getElementById("toptxt");
		console.log(element.innerHTML);
		var childElement = element.getElementsByTagName("a");
		console.log(childElement[0].href);
		var innerXhr = new XMLHttpRequest();
		innerXhr.onload = function(){
			var innerDocument = innerXhr.response;
			var innerElement = innerDocument.getElementsByTagName("a");
			console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
			var innerInnerXhr = new XMLHttpRequest();
			innerInnerXhr.onload = function(){
				var innerInnerDocument = innerInnerXhr.response;
				var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
				console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
				//
				//ネストが続く…
				//
			}
			innerInnerXhr.open('GET','http://allow-any-origin.appspot.com/' + innerElement[Math.floor(Math.random() * innerElement.length)].href);
			innerInnerXhr.responseType = "document";
			innerInnerXhr.send(data);
		}
		innerXhr.open('GET','http://allow-any-origin.appspot.com/' + childElement[0].href);
		innerXhr.responseType = "document";
		innerXhr.send(data);
	}
	xhr.open(method,url);
	xhr.responseType = "document";
	xhr.send(data);
}

xhrStart('GET','http://www.yahoo.co.jp/',null);
```
この質問は最初上記のように(一応、動きます([http://www.yahoo.co.jp/](http://www.yahoo.co.jp/)のドメイン下でコンソールを使ってください。))書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)
```javascript
function xhrStart(method,url,data){
	var xhr = new XMLHttpRequest();
	xhr.onload = function(){
		var document = xhr.response;
		return document;
	}
	xhr.open(method,'http://allow-any-origin.appspot.com/' + url);
	xhr.responseType = "document";
	xhr.send(data);
}

var document = xhrStart('GET','http://www.yahoo.co.jp/',null);
var element = document.getElementById("toptxt");
console.log(element.innerHTML);
var childElement = element.getElementsByTagName("a");
console.log(childElement[0].href);

var innerDocument = xhrStart('GET',childElement[0].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
```
書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。

回答を投稿

function xhrStart(method,url,data){
    var xhr = new XMLHttpRequest();
    xhr.onload = function(){
        var document = xhr.response;
        var element = document.getElementById("toptxt");
        console.log(element.innerHTML);
        var childElement = element.getElementsByTagName("a");
        console.log(childElement[0].href);
        var innerXhr = new XMLHttpRequest();
        innerXhr.onload = function(){
            var innerDocument = innerXhr.response;
            var innerElement = innerDocument.getElementsByTagName("a");
            console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
            var innerInnerXhr = new XMLHttpRequest();
            innerInnerXhr.onload = function(){
                var innerInnerDocument = innerInnerXhr.response;
                var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
                console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
                //
                //ネストが続く…
                //
            }
            innerInnerXhr.open('GET','http://allow-any-origin.appspot.com/' + innerElement[Math.floor(Math.random() * innerElement.length)].href);
            innerInnerXhr.responseType = "document";
            innerInnerXhr.send(data);
        }
        innerXhr.open('GET','http://allow-any-origin.appspot.com/' + childElement[0].href);
        innerXhr.responseType = "document";
        innerXhr.send(data);
    }
    xhr.open(method,url);
    xhr.responseType = "document";
    xhr.send(data);
}

xhrStart('GET','http://www.yahoo.co.jp/',null);

この質問は最初上記のように(一応、動きます)書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)

function xhrStart(method,url,data){
    var xhr = new XMLHttpRequest();
    xhr.onload = function(){
        var document = xhr.response;
        return document;
    }
    xhr.open(method,'http://allow-any-origin.appspot.com/' + url);
    xhr.responseType = "document";
    xhr.send(data);
}

var document = xhrStart('GET','http://www.yahoo.co.jp/',null);
var element = document.getElementById("toptxt");
console.log(element.innerHTML);
var childElement = element.getElementsByTagName("a");
console.log(childElement[0].href);

var innerDocument = xhrStart('GET',childElement[0].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);

書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。

```javascript
function xhrStart(method,url,data){
	var xhr = new XMLHttpRequest();
	xhr.onload = function(){
		var document = xhr.response;
		var element = document.getElementById("toptxt");
		console.log(element.innerHTML);
		var childElement = element.getElementsByTagName("a");
		console.log(childElement[0].href);
		var innerXhr = new XMLHttpRequest();
		innerXhr.onload = function(){
			var innerDocument = innerXhr.response;
			var innerElement = innerDocument.getElementsByTagName("a");
			console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);
			var innerInnerXhr = new XMLHttpRequest();
			innerInnerXhr.onload = function(){
				var innerInnerDocument = innerInnerXhr.response;
				var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
				console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
				//
				//ネストが続く…
				//
			}
			innerInnerXhr.open('GET','http://allow-any-origin.appspot.com/' + innerElement[Math.floor(Math.random() * innerElement.length)].href);
			innerInnerXhr.responseType = "document";
			innerInnerXhr.send(data);
		}
		innerXhr.open('GET','http://allow-any-origin.appspot.com/' + childElement[0].href);
		innerXhr.responseType = "document";
		innerXhr.send(data);
	}
	xhr.open(method,url);
	xhr.responseType = "document";
	xhr.send(data);
}

xhrStart('GET','http://www.yahoo.co.jp/',null);
```
この質問は最初上記のように(一応、動きます)書くとネストばかりで可読性がすごく損なわれ、変数が衝突する可能性があるので関数を作ろうと思って以下のように(動きません)
```javascript
function xhrStart(method,url,data){
	var xhr = new XMLHttpRequest();
	xhr.onload = function(){
		var document = xhr.response;
		return document;
	}
	xhr.open(method,'http://allow-any-origin.appspot.com/' + url);
	xhr.responseType = "document";
	xhr.send(data);
}

var document = xhrStart('GET','http://www.yahoo.co.jp/',null);
var element = document.getElementById("toptxt");
console.log(element.innerHTML);
var childElement = element.getElementsByTagName("a");
console.log(childElement[0].href);

var innerDocument = xhrStart('GET',childElement[0].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerElement = innerDocument.getElementsByTagName("a");
console.log(innerElement[Math.floor(Math.random() * innerElement.length)].href);

var innerInnerDocument = xhrStart('GET',innerElement[Math.floor(Math.random() * innerElement.length)].href,null);
var innerInnerElement = innerInnerDocument.getElementsByTagName("a");
console.log(innerInnerElement[Math.floor(Math.random() * innerInnerElement.length)].href);
```
書きたかったのですが、非同期モードなのでサーバーからレスポンスが戻る前に戻り値(document)を参照したためundefined(未定義値)が返って来たのだとおもいます。もしこれを改善するならどのようにすればいいでしょうか?ご教授よろしくお願いします。