1

最後の行では、関数が AJAX 呼び出しであるgetElementsByClassNameため、要素が見つかりません。loadhtml

getElementsByClassName最後の行を機能させるために、非同期関数またはES6ジェネレーターまたは約束を使用する方法は?

    TotalArticleNumber = 3;

    for (let i = TotalArticleNumber; i > 0; i--) {
      loadhtml('./article/test' + i + '.md', function(e) {
        sdf(i, e);
      });
    };


    function loadhtml(url,callback) {
     var xhttp = new XMLHttpRequest();
      xhttp.onreadystatechange = function() {
       if (xhttp.readyState == 4) {
        if( xhttp.status == 200){
         var response = xhttp.responseText;
         (callback)(response);
        }
       };
     };

      xhttp.open("GET", url, true);
      xhttp.send();
    };



    function sdf(i, e) {
      var node = document.createElement("DIV");
      var node1 = document.createElement("A");
      var node2 = document.createElement("H1");
      var node3 = document.createElement("P");

      node.setAttribute('class', 'articleInner');
      node1.setAttribute('class', 'openArticle');
      node2.setAttribute('class', 'title');
      node2.setAttribute('id', i);
      node2.innerHTML = e.match(re);
      node3.innerHTML = converter.makeHtml(e.replace(re1, ""));
      node1.appendChild(node2);
      node1.appendChild(node3);
      node.appendChild(node1);

      document.getElementById('articleContent').appendChild(node);
    }

    Array.prototype.forEach.call(document.getElementsByClassName('title'), function(item) {
      item.addEventListener('click', function() {
        document.getElementById('realArticle').style.display = 'block';
        document.body.style.background = 'gray';
      })
    })
4

1 に答える 1

0

これに機能を使用させたい場合はasync、このコアをasync functionブロックでラップし、使用awaitする各 promise に対してキーワードを使用する必要があります。

が非同期関数であると仮定するloadHtmlと、これを使用できます。

function loadHTML(url) {
    return new Promise((resolve, reject) => {
        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
            if (xhttp.readyState == 4) {
                var response = xhttp.responseText;
                if (xhttp.status == 200) {
                    resolve(response);
                } else {
                    reject(response)
                }
            };
        };
        xhttp.open("GET", url, true);
        xhttp.send();
    })
};
async function loadHtmlAndMakeElements(){
    TotalArticleNumber = 3;
    let promises = []
    for (let i = TotalArticleNumber; i > 0; i--) {
        promises.push(new Promise((resolve, reject) => {
            loadHTML(`./article/test${i}.md`).then(e => {
                sdf(i, e);
                resolve()
            });
        }))
    }
    await Promise.all(promises);
    Array.prototype.forEach.call(document.getElementsByClassName('title'), function(item) {
        item.addEventListener('click', function() {
            document.getElementById('realArticle').style.display = 'block';
            document.body.style.background = 'gray';
        })
    })
}
function sdf(i, e) {
    var node = document.createElement("DIV");
    var node1 = document.createElement("A");
    var node2 = document.createElement("H1");
    var node3 = document.createElement("P");
    node.setAttribute('class', 'articleInner');
    node1.setAttribute('class', 'openArticle');
    node2.setAttribute('class', 'title');
    node2.setAttribute('id', i);
    node2.innerHTML = e.match(re);
    node3.innerHTML = converter.makeHtml(e.replace(re1, ""));
    node1.appendChild(node2);
    node1.appendChild(node3);
    node.appendChild(node1);
    document.getElementById('articleContent').appendChild(node);
}
loadHtmlAndMakeElements()
于 2016-07-14T03:53:38.060 に答える