所以我正在使用回调函数,当然如果我console.log
返回参数它显示数据,但我如何将返回数据分配给外部变量。下面的代码是我试图实现的,但它返回undefined。是否有设计模式来实现这一目标?我试过寻找答案,但不确定该寻找什么,或者甚至可能吗?
var person = (function () {
function message(messages, callback) {
chrome.runtime.sendMessage(messages, function(response) {
callback(response);
});
}
return {
male: message
};
})();
var me = person.male({
mydata: {
firstname: 'john',
lastname: 'doe'
}
}, function (person) {
// of course this works
console.log(person);
return person;
});
// does not work
console.log(me);
答案 0 :(得分:2)
在您的特定代码中,您已经证明您的回调是由person.male()
方法调用的,但它完全取决于person.male()
函数的设计与它的返回值的作用回调。
如果person.male()
异步调用回调(例如将来的某个时间),那么它就没有机会从person.male()
返回您的返回值。如果所有内容都是同步的,则只有在person.male()
写入时才会从person.male()
返回回调的返回值。由于它没有这样做,所以显然不是这样写的,而person.male()
代码之外的任何内容都不会改变它的工作方式。
现在,您已经显示了person.male()
的代码,我们可以看到回调是由chrome.runtime.sendMessage()
函数调用的,因此回调的返回值会返回到该函数中。 person.male()
不会编写任何带回调值的返回值。
并且,根据chrome.runtime.sendMessage()
的目的判断,我会说它可能异步调用回调,这意味着它在person.male()
已经返回之后被调用,因此无法获得返回从person.male()
返回的回调值,因为person.male()
在回调被调用之前返回。
仅供参考,您可以使用这个更容易理解的代码替换您稍微复杂的person
定义:
var person = {
male: function(messages, callback) {
chrome.runtime.sendMessage(messages, callback);
}
};
答案 1 :(得分:0)
回调函数可以直接设置“外部”变量。但是,如果异步调用回调,那么在此之前将不确定'me':
var me;
person.male({
mydata: {
firstname: 'john',
lastname: 'doe'
}
}, function (person) {
console.log(person);
me = person;
});
// 'me' will be undefined until the callback is called.
console.log(me);
答案 2 :(得分:0)
这是异步代码,因此您不会延迟主线程,直到获得函数的结果。您需要在示例中访问console.log(me)
处的值。