Tizen Web 应用程序可穿戴:TypeMismatchError

Tizen Web Application Wearable :TypeMismatchError

获得TypeMismatchError: Value is not Object以下代码

var fileHandler = {
    storages:null,
    documentsDIR:null,
    newFile:null,
    dirName:"documents",
    fileName:"test.csv",
    init: function init(){
        //tizen.filesystem.listStorages(this.checkCorruptedRemovableDrives);documents
        tizen.filesystem.resolve(this.dirName, this.resolveSuccessCB,this.resolveErrorCB,"rw");

    },

    resolveSuccessCB: function resolveSuccessCB(result){
        this.documentsDir = result;
        //this.newFile = documentsDir.createFile(this.fileName);
        // Error Here - TypeMismatchError: Value is not Object
        result.listFiles(this.listFilesSuccessCB);
        console.log("All Good in "+this.documentsDir);
    },

    resolveErrorCB: function resolveErrorCB(error){
        console.log("Unable to access "+this.dirName+". Error:"+error.message);
    },

    listFilesSuccessCB: function listFilesSuccessCB(files){ 
        for (var i = 0; i < files.length; i++){
          /* Display the file name and URI */
          console.log("File name is " + files[i].name + ", URI is " + files[i].toURI());
       }
    },



    onStorage: function onStorage(storage){ 
           console.log("Storage found:" + storage.label);
    },
    checkCorruptedRemovableDrives: function checkCorruptedRemovableDrives(storages){
        this.storages = storages;
        for (var i = 0; i < storages.length; i++) 
        { 
            if (storages[i].type != "EXTERNAL"){
                continue;
            }
            if (storages[i].state == "UNMOUNTABLE"){
                console.log("External drive " + storages[i].label + " is corrupted.");
            } else {
                console.log(" Storage = " + storages[i].label );
                // Error here - TypeMismatchError: Value is not Object
                tizen.filesystem.getStorage(storages[i].label, this.onStorage);
            }
        }
    }

};

错误发生在代码中标记为Error Here的两个地方。

tizen.filesystem.getStorage(storages[i].label, this.onStorage);中第一个参数的数据类型是DOMString并且storages[i].label也是DOMString类型。 在 result.listFiles(this.listFilesSuccessCB); 中需要一个回调函数。

大部分代码已从 Tizen FileSystem Guide 复制粘贴,但仍然无法正常工作。

请帮忙。预先感谢!! 另外,当我浏览我的可穿戴设备的文件系统时,我在哪里可以找到 "documents" 目录。

您可以从 Tizen IDE 在线示例应用程序获得帮助。 File Manager App Tizen Web App 将为您提供帮助。

并查看 Tizen 的 Filesystem API。 要获取文件管理器在线示例,

  • 转到新 Web 项目
  • 在线示例
  • 查找文件管理器

演示:

简单答案将 this 更改为 fileHandler

当您的函数在 tizen API 中被调用时,请不要相信 "this"。

您似乎使用 checkCorruptedRemovableDrives 成功回调 tizen.filesystem.listStorages

并且您信任 checkCorruptedRemovableDrives 中的 "this" 是 fileHandler

但大多数 Tizen web API 回调函数调用如下代码。

callback.apply(callback, [].slice.call(arguments, 1));

apply 的第一个参数被传递给 callback for this 但它是自函数对象。

所以如果你想在你的函数中使用 fileHandler,请不要使用 this,直接使用 fileHandler。

以下代码是 Tizen web API 实现您可以查看 this 以下 callIfPossible 函数。

function listStorages() {
  xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.FILESYSTEM_READ);
  var args = validator_.validateArgs(arguments, [
    {name: 'onsuccess', type: types_.FUNCTION},
    {name: 'onerror', type: types_.FUNCTION, optional: true, nullable: true}
  ]);

  setTimeout(function() {
    var storages = [];
    var cache = commonFS_.getAllStorages();
    for (var i = 0; i < cache.length; ++i) {
      storages.push(new FileSystemStorage(cache[i]));
    }

    native_.callIfPossible(args.onsuccess, storages);
  }, 0);
};

https://review.tizen.org/git/?p=platform/core/api/webapi-plugins.git;a=blob;f=src/filesystem/js/file_system_manager.js;h=622f38d479647584012925773d124d7f9a59e51d;hb=refs/heads/tizen#l158

NativeManager.prototype.callIfPossible = function(callback) {
  if (!_type.isNullOrUndefined(callback)) {
    callback.apply(callback, [].slice.call(arguments, 1));
  }
};

https://review.tizen.org/git/?p=platform/core/api/webapi-plugins.git;a=blob;f=src/utils/utils_api.js;h=5502e3f2a46254c7e2da9d838bacd55be9aaab20;hb=refs/heads/tizen#l1141