我应该检查什么?未捕获(在承诺中)TypeError:无法读取未定义 URL 的属性“MyFunctionName”
该问题仅发生在已编译的应用程序中,因此我猜测这是特定于浏览器的特定问题,但我不确定:
我已将以下脚本添加到网页:
async function exportChatAsXMLHelper(params){
let displayname = params[0];
let includeMedia = params[1];
let debug = params[2];
await exportChatAsXML(displayname, includeMedia, debug);
}
async function exportChatAsXML(displayname, includeMedia, debug)
{
let chat = (await WPP.chat.list()).find(m => m.contact && m.contact.name && m.contact.name.includes(displayname));
await WPP.chat.openChatBottom(chat.id);
let msgs = await WPP.chat.getMessages(chat.id, {count : -1});
const log = (obj) => debug && console.log(obj);
log('Total messages: ' + msgs.length);
let count=msgs.length;
for (var i = 0; i < count; i++) {
log('Message number: ' + i);
let message = msgs[i];
let xml='';
xml+= '<message>';
xml+= '<sender>'+ message.from.user +'</sender>';
xml+= '<receiver>'+ message.to.user +'</receiver>';
xml+= '<type>'+ (message.type || '') +'</type>';
if(message.type == 'chat')
{
xml+= '<body>'+ message.body +'</body>';
}
if(message.type != 'chat' && includeMedia)
{
xml+= '<media>';
xml+= '<caption>'+ (message.caption || '') +'</caption>';
xml+= '<filename>'+ (message.filename || '') +'</filename>';
log('Downloading media');
try
{
let mediabody = await mediatoBase64(message.id);
xml+= '<MediaDownloadStatus>success</MediaDownloadStatus>';
xml+= '<base64>'+ mediabody +'</base64>';
}
catch(e)
{
xml+= '<base64></base64>';
xml+= '<MediaDownloadStatus>fail</MediaDownloadStatus>';
}
xml+= '</media>';
}
xml+= '</message>';
alert('before'); //this is still shown
//where is JSCallbackReceiver defined? it is from vb6
window.JSCallbackReceiver.OnWhatsAppXMLReceived(i, count, xml);
alert('after'); //this is not shown
xml='';
}
}
//-----
async function mediatoBase64(msgid) {
let blob = await WPP.chat.downloadMedia(msgid);
return new Promise((resolve, _) => {
const reader = new FileReader();
reader.onloadend = () => resolve(reader.result);
reader.readAsDataURL(blob);
});
}
它在我的开发人员的机器上运行良好,但在客户的机器上会抛出错误:
Uncaught (in promise) TypeError: Cannot read property 'OnWhatsAppXMLReceived' of undefined https://web.whatsapp.com/ 80
我现在添加了一些警报,以查看到底哪里出了问题。 显示“之前”警报,不显示“之后”警报,因此错误肯定发生在
window.JSCallbackReceiver.OnWhatsAppXMLReceived(i, count, xml);
alert('after');
我可以检查什么来查看客户端机器上到底出了什么问题/有什么不同?
回调对象在 VB6 中定义如下:
Private m_JSCallback As clsJSCallbackReceiver
Set m_JSCallback = New clsJSCallbackReceiver
Me.webkit1.AddObject "JSCallbackReceiver", m_JSCallback
错误消息是否意味着浏览器找不到我通过
AddObject
添加的对象?
我正在使用基于 Chromium 的 mobileFx webkit 浏览器 ,但我想这并不重要。
这是类
clsJSCallbackReceiver
在 VB6 中的样子:
Option Explicit
Public Sub OnWhatsAppXMLReceived(ByVal uIndex As Long, ByVal uCount As Long, ByVal uXml As String)
Debug.Print("I was called!")
End Sub
Public Sub SaySomething(ByVal u As String)
MsgBox(u)
End Sub
谢谢你!
编辑:
我只在编译时发生。 当我在 VB6 IDE 中运行它时,它工作正常。
错误发生后,我仍然可以调用
m_JSCallback.SaySomething("Hello!")
,它会工作。
所以对象还活着。 我猜它只是没有连接到浏览器。
我找到了 此文档 ,其中提到了他们给出的一个示例:
“接下来,由于类的 Instancing 属性为 PublicNotCreatable,因此项目必须为客户端提供一种实例化对象的方法。在标准模块中添加一个新函数。其中 clsEmployee 是相关类的名称。此外,这不应是私有模块。”
而您的代码似乎与此相矛盾。
错误消息向您解释了以下行:
window.JSCallbackReceiver.OnWhatsAppXMLReceived(i, count, xml);
window.JSCallbackReceiver
对象未定义。
首先,要摆脱此错误消息,您应该将此行替换为:
if (window.JSCallbackReceiver) {
window.JSCallbackReceiver.OnWhatsAppXMLReceived(i, count, xml);
}
这不会解决您的问题,因为它只是抑制了错误。
因此,您需要调查为什么
SCallbackReceiver
在客户的浏览器上未定义。
要获得更多帮助,您需要提供有关
JSCallbackReceiver
的源代码。