corodva文件读取执行成功和失败回调

时间:2016-02-22 13:00:56

标签: javascript cordova

我有一个用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()

触发的

有没有人猜测发生了什么?

1 个答案:

答案 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
相关问题