2015-01-03 58 views
1

當嘗試這個簡單的代碼,除了JavaScript函數返回:未定義調試時

function create_folder(name, parent_ID) { 
    var BM_folder = ""; 
    chrome.bookmarks.create({title : name, parent_id : parent_ID }, function (new_folder) { 
     BM_folder = new_folder; 
    }); 
    console.log("create folder in id : " + BM_folder.id); 
    return BM_folder.id; 
} 

我得到undefined作爲輸出,但是當我調試它工作正常,我得到了真正的書籤ID。我在更多功能上遇到類似的問題,我想這是同樣的問題。編輯#1:固定增值稅,我真正的功能有完整的字符串,我根本無法發佈這種方式。

編輯#2:謝謝Marco Bonelli,有沒有辦法把它變成同步,這樣我就可以使用普通的oop了?

+0

奇怪的是如何將變量'parent-id'與成員名'parent-ID'進行交換。定義JS對象時是否工作? – maurice

+0

'new-folder'這是語法錯誤,所以你的代碼甚至無法運行。我建議發佈真正的變量名稱,而不是混淆人。 – dfsq

+0

無論如何,這是重複http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call – dfsq

回答

3

有在你的代碼的幾個問題:

  1. 首先,該功能不能工作......你使用連字符(-)和可變/函數名稱不能含有hypens在JavaScript中,請將其改爲其他內容,例如create_foldercreateFolder。對於變量BM-folderparent-ID也是如此。稱它們爲BMFolderparentID

  2. 其次,您創建的對象以錯誤的方式傳遞到chrome.bookmarks.create()parent-ID是錯誤的和未定義的。你應該這樣做:chrome.bookmarks.create({title: name, parentID: parentid})

  3. 裏面的功能,我們在調用chrome.bookmarks.create()方法,這是異步:這意味着該代碼是從你的函數體,當方法已經完成的工作,它會調用單獨處理回調函數,作爲第二個參數提供。基本上,當調用chrome.bookmarks.create()時,您必須等待,直到它完成繼續,因爲如果您在調用回調之前嘗試訪問BMfolder.id變量,它顯然將是未定義的。

現在,總結一下我上面說的,我給爲實現您的正確的代碼正在嘗試:

function createFolder(name, parentid) { 
    chrome.bookmarks.create({title: name, parentID: parentid }, function (newFolder) { 
     console.log("Created the folder with ID: " + newFolder.id); 
     goOn(newFolder); 
    }); 
} 

function goOn(BMFolder) { 
    console.log('Here is the folder: ', BMFolder); 
    // do something... 
} 

不能使用return BMFolder.id,因爲你的函數是異步的,因此只有知道書籤文件夾已被創建,才能調用另一個函數來繼續。例如,您可以將其命名爲goOn()


編輯:

有沒有辦法把它變成同步,這樣我就可以正常使用OOP?

不幸的是,您無法將異步功能轉換爲同步功能。 Chrome擴展的方法是只是異步,因此你必須在這方面的工作。順便說一下,異步工作比同步工作更有效率,您應該習慣這種編程風格,因爲(如前所述)Chrome擴展只能異步工作,其他許多JS框架和API也是如此。

+0

偉大的謝謝,所以它就像ajax,有一個方式使其工作同步... –

+0

@oriandabud nope,鉻擴展的方法只是異步 –

+0

所以它是另一種方式來等待函數,然後插入到本地? –