在array.push之后未定义数组元素

时间:2018-12-06 07:49:26

标签: javascript arrays fetch

我的网络服务器上有一个目录,我在其中上传timestamp.md文件以发布到我的网站上的“ blog” -div中。使用javascript通过scandir()(PHP)获取dir的索引将返回:

["2018-12-05T13:28:10.000Z.md","2018-12-05T12:58:19.858Z.md","2018-12-05T12:37:25.012Z.md","2018-12-05T12:28:52.612Z.md","..","."]

我将obve存储在var“文件”中。

然后我对从index.html进行的提取进行for循环,以获取timestamp.mds中所有内容的内容

(我创建了一个用于存储md内容的空数组)

var mdcontent = new Array()

for(var i=0;i<files.length -2;i++) {

    fetch('md/'+files[i])
    .then( response => response.text())
    .then(result => mdcontent.push(result));

}

console.log(mdcontent) returns what looks like a normal array 
consol.log(mdcontent[0]) (or any other element of array) returns undefined.
console.log(mdcontent.lenght) returns 0.

问题是如何访问此数组的元素?

我不知道这次出了什么问题,如果有人可以帮助我,我将不胜感激!

预先感谢

1 个答案:

答案 0 :(得分:2)

当您使用fetch时,它将返回Promise,它代表异步操作。您不应该像这样做那样访问mdcontent的元素-同步代码可以,但是不能在此处访问。相反,您需要等待每个诺言(每个fetch + .text())都将完成。您可以使用Promise.all来做到这一点。

var promises = new Array();

for (var i=0; i < files.length - 2; i++) {
    promises.push(
        fetch('md/' + files[i])
        .then(res => res.text())
    );
}

Promise.all(promises).then(mdcontent => {
    console.log(mdcontent);
    console.log(mdcontent.length);
    console.log(mdcontent[0]);
});

我建议您阅读有关异步javascript的内容。也许this article。当您不了解承诺的异步性质时,可能很难使用承诺。您可能还想使用asynchronous functionsawait而不是.then(...)