我目前在 Windows 8/WinRT 应用程序中读取文件时遇到问题。我有一个简单的导航风格应用程序,多个页面可以访问相同的数据,并且我有一个 data.js 文件,该文件定义了一个包含多个成员的命名空间(数据)。应用程序的一部分将项目保存到存储在应用程序本地数据文件夹中的 txt 文件中。但是在其他一些页面上,我需要阅读此内容或检查以前保存的项目列表中是否存在项目。为此,我在 data.js 文件中添加了另一种方法。问题是,当我调用此方法来检查项目是否存在时,由于异步性质,它不会立即返回值,但页面特定 js 文件中的其余代码似乎仍然在它之前执行跳回解析。这意味着检查项目的逻辑不 t 似乎工作。我觉得这取决于我对 .done 或 .then 的使用,但我的代码如下:
DATA.JS
var doesItemExist= function(item_id){
var appFolder = Windows.Storage.ApplicationData.current.localFolder;
//note I've tried this with and without the first "return" statement
return appFolder.getFileAsync(dataFile).then(function (file) {
Windows.Storage.FileIO.readTextAsync(file).done(function (text) {
try {
var json = JSON.parse(text);
if (json) {
for (var i = 0; i < json.items.length; i++) {
var temp_item = json.items[i];
if (temp_item.id === item_id) {
return true;
break;
}
}
} else {
return false;
}
} catch (e) {
return false;
console.log(e);
}
}, function (e) { return false;console.log(e); });
}, function (e) { // error handling
return false;
console.log(e);
});
}
WinJS.Namespace.define("Data", {
doesItemExist: doesItemExist
}); //all of the above is wrapped in a self executing function
然后在 Page.js 我有以下内容:
var add = document.getElementById('add');
if (Data.doesItemExist(selected_item.id)) {
add.style.display = 'block';
} else {
add.style.display = 'none';
}
这里的所有变量都已分配,调试不会产生任何错误,控制似乎只是在它到达 getFileAsync 之后但在它甚至通过 for 循环之前返回到 if/else 语句。但随后它确实进入了 for 循环,但在 if 语句完成之后。我猜这取决于这一切的异步性质,但我不知道如何解决它。有任何想法吗?
谢谢