2016-07-14 189 views
1

就上线循环中,getElementsByClassName找不到元素,因为loadhtml功能是一个AJAX调用。的JavaScript与异步功能

如何使用异步函数或ES6发电机或承诺,为了使getElementsByClassName最后一行的工作?

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'; 
     }) 
    }) 
+0

你需要promisify的loadhtml函数或建立在'fetch'之上。 –

+0

你可以添加'loadhtml'的代码吗? – Quill

+0

为什么不简单地将事件处理程序添加到'node2'?您不需要任何'getElementsByClassName'选择,并且在创建所有元素之后不需要计时。 – Bergi

回答

0

如果你想使这个使用async功能,你需要用这个核心在async function块,并使用await关键字每个答应你使用:

假设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() 
+1

为什么'返回Promise.resolve()'?此外,在回调内部功能不是异步,你不能这样做...... –

+0

它说的'意外的标记等待SDF(I,E)' –

+0

@ J.Doe看到编辑 – Quill