除了调试时,JavaScript函数返回undefined

时间:2015-01-03 18:59:19

标签: javascript google-chrome google-chrome-extension

尝试这个简单的代码时:

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?

1 个答案:

答案 0 :(得分:3)

您的代码中存在几个问题:

  1. 首先,该功能无法工作......您正在使用超级(-),而变量/函数名称不能包含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变量,那么显然未定义。

  4. 现在,总结一下我上面所说的内容,我将展示正确的代码,以实现您的目标:

    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也是如此。