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?
你的代码有几个问题:
首先,那个函数不能工作...你使用的是连字符(-
),variable/function 名称在 JavaScript 中不能包含连字符,因此请将其更改为其他内容,例如 create_folder
或 createFolder
。这与您的变量 BM-folder
和 parent-ID
相同。称他们为 BMFolder
和 parentID
.
其次,您正在以错误的方式创建要传递给 chrome.bookmarks.create()
的对象:parent-ID
既错误又未定义。你应该这样做:chrome.bookmarks.create({title: name, parentID: parentid})
.
在你的函数中,你正在调用 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 也是如此。
尝试这个简单的代码时:
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?
你的代码有几个问题:
首先,那个函数不能工作...你使用的是连字符(
-
),variable/function 名称在 JavaScript 中不能包含连字符,因此请将其更改为其他内容,例如create_folder
或createFolder
。这与您的变量BM-folder
和parent-ID
相同。称他们为BMFolder
和parentID
.其次,您正在以错误的方式创建要传递给
chrome.bookmarks.create()
的对象:parent-ID
既错误又未定义。你应该这样做:chrome.bookmarks.create({title: name, parentID: parentid})
.在你的函数中,你正在调用
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 也是如此。