Skip to content

Instantly share code, notes, and snippets.

@maripiyoko
Created August 27, 2015 11:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maripiyoko/fc01d718138cb5d75f69 to your computer and use it in GitHub Desktop.
Save maripiyoko/fc01d718138cb5d75f69 to your computer and use it in GitHub Desktop.
AngularJS で Promise (defer)を使ってファイルシステムからファイルを読み込む (cordova filesystem) ref: http://qiita.com/mm36/items/a9869a2066ace1aed0a8
function slowCall() {
var df = $q.defer();
// 非同期処理を担当する関数を定義
function fn() {
var msg = 'now : ' + new Date().getTime();
alert('inside async function.');
df.resolve(msg);
};
$timeout(fn, 1000);
return df.promise;
};
var testDeferSample = function () {
alert('test defer sample start.');
slowCall().then(function () {
alert('END!');
});
alert('Opps.. outside');
};
var _writeFile = function(dirPath, fileName, fileText) {
var deferred = $q.defer();
getTargetDirectory(dirPath).then(function(dirEntry) {
dirEntry.getFile(fileName, { create: true },
function(fileEntry) {
fileEntry.createWriter(
function(writer) {
var cb = function() {
//console.log("write end");
alert("保存しました。");
deferred.resolve(fileName);
}
writer.onwrite = cb;
writer.onerror = function() { console.log("保存に失敗しました。"); }
//console.log( fileText );
writer.write( fileText );
} ,
function() {
console.log("create writer error");
}
);
},
failFiles
);
});
return deferred.promise;
};
var createJsonObject = function (targetDirPath, fileName) {
var deferred = $q.defer();
readFile(targetDirPath, fileName).then(function (content) {
var json = { name: fileName, data: content };
deferred.resolve(json);
});
return deferred.promise;
};
var createCallbackFunctionList = function (targetDirPath, fileNames) {
var deferred = $q.defer();
var functions = [];
fileNames.map(function (fileName) {
functions.push(createJsonObject(targetDirPath, fileName));
});
deferred.resolve(functions);
return deferred.promise;
};
var getFileAsJsonList = function () {
var jsonList = [];
var targetDirPath = 'YOUR_TARGET/DIRECTORY/HERE';
var deferred = $q.defer();
// まずディレクトリにあるファイル名を元に、JSONオブジェクトを取ってくる関数を作る
FileUtilService.listDir(targetDirPath).then(function (fileNames) {
createCallbackFunctionList(targetDirPath, fileNames).then(function (fns) {
deferred.resolve(fns);
})
});
// ファイルコンテンツ取得時に非同期処理のため、ファイルの順序がバラバラになる
// 全ファイルコンテンツの取得後に、ファイル名(日時)で並べ替え。
deferred.promise.then(function (promises) {
// 全部実行したい関数の配列を取得 then の後にくる関数は、
// promisesが全て実行し終わったら一番最後に実行される
$q.all(promises).then(function (photos) {
jsonList = photos.sort(function (a, b) {
return parseInt(b.name) - parseInt(a.name);
});
alert('got' + jsonList.length);
angular.forEach(jsonList, function (value, key) {
console.log('FileInfo : ' + value.name + ', content length=' + value.data.length);
})
});
});
};
test defer sample start.
Opps.. outside
inside async function.
END!
var testAllSample = function() {
alert('test sample start.');
var p1 = slowCall().then(function(msg) {
alert('LAST 1' + msg);
return msg;
});
var p2 = slowCall().then(function(msg) {
alert('LAST 2' + msg);
return msg;
});
$q.all([p1,p2]).then(function(res) {
alert('LAST MOST ' + res[0] + ', ' + res[1]);
});
};
test all sample start.
inside async function.
LAST 1 1440643852941
inside async function.
LAST 2 1440643876515
LAST MOST 1440643852941, 1440643876515
var getFileSystem = function() {
var deferred = $q.defer();
window.requestFileSystem(window.PERSISTENT, 1024*1024, function(filesystem) {
deferred.resolve(filesystem);
});
return deferred.promise;
};
var getTargetDirectory = function(dirPath) {
var deferred = $q.defer();
getFileSystem().then(function(filesystem) {
filesystem.root.getDirectory(dirPath, { create: true, exclusive: false },
function(dirEntry) {
deferred.resolve(dirEntry);
},
failFiles
);
});
return deferred.promise;
};
function failFiles(error) {
alert('failFiles' + error.code);
};
var listDir = function (dirPath) {
var deferred = $q.defer();
getTargetDirectory(dirPath).then(function (dirEntry) {
var reader = dirEntry.createReader();
var fileNames = [];
reader.readEntries(
function (entries) {
for (var i = 0; i < entries.length; i++) {
fileNames.push(entries[i].name);
}
deferred.resolve(fileNames);
},
function (error) {
console.log("reading target directory error");
}
);
});
return deferred.promise;
};
var readFile = function(dirPath, fileName) {
var deferred = $q.defer();
getTargetDirectory(dirPath).then(function(dirEntry) {
dirEntry.getFile(fileName, { create: false },
function(fileEntry) {
fileEntry.file(function(file) {
var reader = new FileReader();
reader.onloadend = function() {
deferred.resolve(this.result);
};
reader.readAsText(file);
});
},
function(error) {
console.log("reading target directory error");
}
);
});
return deferred.promise;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment