0

这个问题中,我了解到我可以使用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

这里有两个问题:

  1. 如何修复它以使其从 fileA 转到 fileH?
  2. 解析文件后,我是将代码放在json自调用函数之后还是在返回的 Promise 函数的else循环中使用变量?thenreadFileAsync()
4

1 回答 1

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 接口,所以我不必编写一大堆递归函数。

于 2013-03-18T02:25:47.080 回答