我有一个用Cordova写的移动应用程序。它将一些数据保存到本地存储,并在下次启动时尝试读取它。
我从这里得到了代码:
https://www.neontribe.co.uk/cordova-file-plugin-examples/
function readFromFile(fileName, cb, cbErr) {
var pathToFile = cordova.file.dataDirectory + fileName;
window.resolveLocalFileSystemURL(pathToFile, function (fileEntry) {
fileEntry.file(function (file) {
var reader = new FileReader();
reader.onloadend = function (e) {
cb(JSON.parse(this.result));
};
reader.readAsText(file);
}, cbErr("oops"));
}, cbErr("darn"));
}
var cbError = function(){}
var fileData;
readFromFile('somefile.txt', function (data) {
fileData = data;
},cbError );
和我的onDeviceReady函数中的所有内容。
问题是,当somefile.txt同时存在成功回调(cb)和错误回调(cbError)时,执行。首先是cbError然后是cb AND cb返回我期望的数据。
两个回调都是从fileEntry.file()
触发的有没有人猜测发生了什么?
答案 0 :(得分:0)
您编码的方式实际上是调用函数cbErr
,而不是将其作为参数传递。看
window.resolveLocalFileSystemURL(pathToFile, function (fileEntry) {
fileEntry.file(function (file) {
var reader = new FileReader();
reader.onloadend = function (e) {
cb(JSON.parse(this.result));
};
reader.readAsText(file);
}, cbErr("oops")); // <- This is going to be invoked
}, cbErr("darn")); // <- This is going to be invoked
你想要做的是这个
window.resolveLocalFileSystemURL(pathToFile, function (fileEntry) {
fileEntry.file(function (file) {
var reader = new FileReader();
reader.onloadend = function (e) {
cb(JSON.parse(this.result));
};
reader.readAsText(file);
}, function() { // <- This is going to be sent as an argument
cbErr("oops")
});
}, function() { // <- This is going to be sent as an argument
cbErr("darn")
});
在您发布的链接中,该人正在使用函数.bind
。这是一个非常有趣的函数,当你想调用一个函数并返回另一个函数时,你会使用它来加载所提供的范围和参数。看看mozilla documentation about it。
如果您想要遵循该示例,那么您应该使用以下代码替换您的代码:
window.resolveLocalFileSystemURL(pathToFile, function (fileEntry) {
fileEntry.file(function (file) {
var reader = new FileReader();
reader.onloadend = function (e) {
cb(JSON.parse(this.result));
};
reader.readAsText(file);
}, cbErr.bind(null, "oops")); // <- Here is the .bind function
}, cbErr.bind(null, "darn")); // <- Here is the .bind function