用于从回调函数返回值的方法或设计模式

时间:2014-05-03 20:44:00

标签: javascript

所以我正在使用回调函数,当然如果我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);

3 个答案:

答案 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)处的值。