关于使用参数传递函数的函数编程问题

时间:2013-05-27 13:25:10

标签: javascript

我目前正在编写一个API来将文件解压缩到Web浏览器沙箱文件系统。我基本需要将一个参数传递给一个函数,而该函数本身也作为参数传递。以下是一些代码来说明问题:

//Request a permanent filesystem quota to unzip the catalog.
function requestFilesystem(size){
    window.webkitStorageInfo.requestQuota(PERSISTENT, size*1024*1024, function(grantedBytes) {
        window.requestFileSystem(PERSISTENT, grantedBytes, function(fs) {
            filesystem = fs;
            removeRecursively(filesystem.root, unzip(url), onerror);
        }, onerror);
    }, function(e) {
        console.log('Error', e);
    });
}

//unzip method can be changed, API remains the same.
//URL of zip file
//callback oncomplete
function unzip(URL) {
    importZipToFilesystem(URL, function(){
        console.log("Importing Zip - Complete!");
    });
}

//remove removeRecursively a folder from the FS
function removeRecursively(entry, onend, onerror) {
    var rootReader = entry.createReader();
    console.log("Remove Recursive"+entry.fullPath);
    rootReader.readEntries(function(entries) {
        var i = 0;

        function next() {
            i++;
            removeNextEntry();
        }

        function removeNextEntry() {
            var entry = entries[i];
            if (entry) {
                if (entry.isDirectory)
                    removeRecursively(entry, next, onerror);
                if (entry.isFile)
                    entry.remove(next, onerror);
            } else
                onend();
**Uncaught TypeError: undefined is not a function**
        }

        removeNextEntry();
    }, onerror);
}

如果我尝试使用

function removeRecursively(entry, onend(URL), onerror) { 

有一个错误,我的问题是如何传递解压缩函数的URL值,这个解压缩函数用作removeRecursively onsuccess上的回调函数

2 个答案:

答案 0 :(得分:3)

您正在将解压缩的结果传递给removeRecursively,这是未定义的。

您可能想要做的是

removeRecursively(filesystem.root, function() { unzip(url); }, onerror);

这里传递一个函数作为参数,这个函数用你想要的参数调用unzip。

答案 1 :(得分:1)

您正在致电

removeRecursively(filesystem.root, unzip(url), onerror);

但解压缩不返回任何内容

function unzip(URL) {
    importZipToFilesystem(URL, function(){
        console.log("Importing Zip - Complete!");
    });
}

因此removeRecursivelyonend)的第二个参数变为undefined,当您尝试将其用作函数时,可能会导致错误。

如果你想使用解压缩功能作为回调,你应该在不调用它的情况下传递unzip(而不是unzip(url)),然后在onend(URL)内调用removeRecursively