2013-05-27 51 views
0

我目前正在編寫一個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) { 

有錯誤,AO我的問題是如何圍繞URL值傳遞的解壓縮功能,這解壓縮功能作爲一個回調函數上的removeRecursively

+1

只是傳遞'unzip',不要直接調用它。 'removeRecursively(filesystem.root,unzip,onerror);'not'removeRecursively(filesystem.root,unzip(url),onerror);'。另外,編寫'function removeRecursively(entry,onend(URL),onerror){'完全沒有意義,你怎麼能在param列表中執行? –

+0

@DavidMcMullin事實上,這是一個愚蠢的事情,我誤解了傳遞unzip,我把它作爲一個函數傳遞,函數可以帶參數,所以讓我們把一些參數放在這裏。我不能這麼說,就是爲什麼我問這個問題,這對我來說沒有意義。謝謝回覆! – Astronaut

回答

3

您正在將結果解壓到removeRecursively,這是未定義的。

什麼你可能想要做的就是

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

在這裏,您將一個函數作爲參數,這個函數調用你想要的參數解壓縮。

+0

Duh ...我必須將它傳遞給一個函數,我誤解了通過傳遞unzip的代碼已經將它作爲函數傳遞。我誤導了,因爲如果我把onerror(「Error unzipping」)作爲參數傳遞的話。 //錯誤日誌記錄 函數onerror(消息)console.error(message); } removeRecursively(entry,unzip,onerror(「Error Removing」)); - 工作。去測試這個解決方案。 – Astronaut

1

的的onSuccess要調用

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

但解壓不返回任何

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

所以removeRecursivelyonend)的第二個參數變得undefined,這可能會導致錯誤,當你想使用它作爲一個功能。

如果你想使用解壓功能作爲一個回調,你應該只通過(而不是unzip(url)unzip不調用它,然後調用onend(URL)removeRecursively

+0

問題是我想爲URL傳遞不同的值,所以我想要解壓縮爲一個URL作爲參數。 – Astronaut