0
從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
兩個問題:
- 如何解決它,這樣它的fileA去fileH?
- 解析完文件後,我是否會將代碼與自調函數後的變量
json
或then
函數中的then
函數的readFileAsync()
返回的函數一起使用?
如果在異步函數中'i'增加了值,則應該將其移動到外部函數並傳入文件名。這不能確保順序完成功能,但你需要使它們同步。 – RobG 2013-03-17 22:23:45
@RobG顯然你錯了。異步調用中的增量是完成此操作的關鍵。代碼是正確的,看到這個jsFiddle:http://jsfiddle.net/cS7hs/我用setTimeout取代了異步調用。從輸出看起來這個函數同時被調用兩次。錯誤在別的地方。 – freakish 2013-03-17 22:26:41