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

ここで 2 つの質問:

  1. fileA から fileH に移動するように修正するにはどうすればよいですか?
  2. ファイルを解析したjson後、自己呼び出し関数の後、またはによって返される Promiseelseの関数内のループ内で変数を操作するコードを配置しますか?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 に答える