中使用我目前在Windows 8/WinRT應用程序中讀取文件時遇到問題。我有一個簡單的導航風格的應用程序,幾個頁面可以訪問相同的數據,我有一個data.js文件,它定義了一個包含多個成員的命名空間(Data)。應用程序的一部分將項目保存到存儲在應用程序本地數據文件夾中的txt文件中。但在其他一些頁面上,我需要閱讀這些內容或檢查以前保存的項目列表中是否存在項目。爲此,我在data.js文件中添加了另一個方法。麻煩的是,當我調用這個方法來檢查一個項目的存在時,由於異步性質它不會立即返回值,但頁面特定的js文件中的其餘代碼似乎仍然在它之前執行跳回到解析。這意味着檢查項目的邏輯似乎不起作用。我有一種感覺它的下跌給我使用的任何.done或者。然後,但我的代碼如下:從使用WinJS讀取的文件返回值以便在第
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語句結束之後。我猜這是所有的異步性質,但我不知道如何繞過它。有任何想法嗎?
謝謝
我想你在這裏需要的是讓data.js中的代碼返回一個Promise,然後你會在頁面特定的JS文件中使用它來獲取布爾值。讓我看看我一直在努力的應用程序之一,我會張貼一些代碼來簡要說明。 – devhammer 2012-08-14 14:58:57