JavaScript 函数 returns 未定义,调试时除外

JavaScript function returns undefined except when debugging

尝试这个简单的代码时:

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:修复变量,我的真实函数有完整的字符串,我根本不能那样 post。

编辑 #2:谢谢 Marco Bonelli,有没有办法将其变为同步,以便我能够使用正常的 oop?

你的代码有几个问题:

  1. 首先,那个函数不能工作...你使用的是连字符(-),variable/function 名称在 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().


编辑:

Is there a way to turn this into sync, so that I'll be able to use normal oop?

遗憾的是,您无法将异步函数转换为同步函数。 Chrome 扩展的方法 只是异步的 ,因此您必须在这方面努力。顺便说一句,异步工作比同步工作效率高得多,你应该习惯这种编程风格,因为(如前所述)Chrome 扩展只能异步工作,许多其他 JS 框架和 API 也是如此。