从this question开始,我收集到我可以使用forEach
循环或自调用来执行异步I / O操作。我不确定它为什么不适合我,但是循环部分工作正常,没有任何异步函数被调用。
var fileNames = ["fileA", "fileB", "fileC", "fileD", "fileE", "fileF", "fileG", "fileH"];
var json;
(function parseFiles(i) {
console.log(i + " " + fileNames[i]);
var uri = new Windows.Foundation.Uri('ms-appx:///data/' + fileNames[i] + '.json');
Windows.Storage.StorageFile.getFileFromApplicationUriAsync(uri).then(function (file) {
Windows.Storage.FileIO.readTextAsync(file).then(function (contents) {
json[fileNames[i]] = JSON.parse(contents);
if (i < fileNames.length) {
parseFiles(i+1);
} else {}
});
});
})(0);
我的控制台输出有点奇怪:
0 fileA
1 fileB
0 fileA
2 fileC
1 fileB
3 fileD
2 fileC
3 fileD
这里有两个问题:
json
函数中的else
循环中,是否将代码放在变量then
中?由readFileAsync()
?答案 0 :(得分:0)
我最终这样做了:
var fileNames = ["fileA", "fileB", "fileC", "fileD", "fileE", "fileF", "fileG", "fileH"];
var json;
(function parseFiles() {
var name = fileNames.pop();
Windows.Storage.StorageFile.getFileFromApplicationUriAsync(new Windows.Foundation.Uri('ms-appx:///data/' + name + '.json'))
.then(function (file) {
return Windows.Storage.FileIO.readTextAsync(file);
}, function error(e){
console.dir(e);
})
.then(function (contents) {
json[name] = JSON.parse(contents);
})
.then(function () {
console.log("Name: "+name+" Remaining array length:"+fileNames.length);
if (fileNames.length === 0) {
console.log('all done');
// do whatever else here
} else {
parseFiles();
}
});
})();
我很高兴递归函数中的异步方法使用Promise接口,因此我不必编写一大堆递归函数。