chrome.runtime.sendMessage参数消息,是否支持函数类型?

时间:2013-12-03 13:45:58

标签: google-chrome-app sendmessage

var msg = { name: '', type: 'xhr', success: function(){}, args: {
url: 'exp.com', type: 'GET', dataType: 'html', success: function(){}, error: function(){console.log('failed') } };

chrome.runtime.sendMessage(msg, function(response){
    console.log(response);
});

我尝试创建一个回调函数,比如success:function(){},error(){},但是不起作用,为什么?

我用的时候 chrome.runtime.onMessage.addListener(function(message, sender, sendResponse){ console.log(message) }); 但无法获得成功:function(){},错误:function(){}?

1 个答案:

答案 0 :(得分:0)

不,sendMessage不支持发送功能。 sendMessage通过在发送消息之前将对象序列化为JSON字符串来进行操作。 JSON不支持函数(for several reasons),并且将删除消息中的任何函数对象。例如,测试JSON.stringify({ success: function() {} }):得到结果"{}",因为值为函数的键会被删除。

相反,您需要:

  1. 在消息中传递一些函数参数,让接收者构建一个新函数。例如,传递success: { action: "display", header: "Here are your results..." }然后让接收者使用这些参数来构建一个新函数,该函数执行具有给定display值的header操作。

  2. 在传输前将函数转换为字符串,然后eval函数字符串在收到时重建函数。这是一个讨厌的黑客,并将删除该功能以前可以访问的任何外部范围,但它将工作。请注意,您需要将函数表达式包装在括号中,以便eval解析它:

    eval( "(" + functionString + ")" );