現在、Windows 8/WinRT アプリケーションで読み取ったファイルに問題があります。シンプルなナビゲーション スタイルのアプリがあり、複数のページが同じデータにアクセスでき、多数のメンバーを持つ名前空間 (データ) を定義する data.js ファイルがあります。アプリケーションの一部は、アイテムをアプリケーションのローカル データ フォルダーに保存されている txt ファイルに保存します。しかし、他のいくつかのページでは、これを読み込むか、以前に保存されたアイテムのリスト内にアイテムが存在するかどうかを確認する必要があります。これを行うために、data.js ファイルに別のメソッドを追加しました。問題は、アイテムの存在を確認するためにこのメソッドを呼び出すと、非同期の性質のためにすぐに値が返されないことですが、ページ固有の js ファイル内の残りのコードは、その前にまだ実行されているようです。解析に戻ります。これは、アイテムをチェックするロジックが「うまくいかないようです。.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 ステートメントが終了した後です。これはすべての非同期の性質によるものだと思いますが、それを回避する方法がわかりません。何か案は?
ありがとう