Windows phone 8 Cordova在Windows Phone 8中的多次回调

Windows phone 8 Cordova在Windows Phone 8中的多次回调,windows-phone-8,cordova,windows-phone,phonegap-plugins,cordova-2.0.0,Windows Phone 8,Cordova,Windows Phone,Phonegap Plugins,Cordova 2.0.0,我有一个Cordova插件,它对Android和iOS都很好。但是,它在移植到Windows Phone 8时失败,因为Cordova for Windows Phone似乎不支持多个未完成的回调 问题在于: 当使用KeepCallback设置为true的PluginResult调用DispatchCommandResult时,来自不同方法的另一个DispatchCommand将调用其回调和上一个回调(KeepCallback设置为true的回调) 更糟糕的是,如果第二个DispatchComm

我有一个Cordova插件,它对Android和iOS都很好。但是,它在移植到Windows Phone 8时失败,因为Cordova for Windows Phone似乎不支持多个未完成的回调

问题在于:

当使用KeepCallback设置为true的PluginResult调用DispatchCommandResult时,来自不同方法的另一个DispatchCommand将调用其回调和上一个回调(KeepCallback设置为true的回调)

更糟糕的是,如果第二个DispatchCommandResult有一个将KeepCallback设置为false(默认值)的PluginResult,那么这将取消将KeepCallback设置为true的任何进一步回调

示例

考虑下面的代码。这是对科尔多瓦回波样本的修改

echo方法将(通过DispatchCommandResult)调用javascript“success”回调,其字符串与最初调用的字符串相同(经过两次JSON转换)

repeat方法与echo方法相同,只是它在一个单独的线程中每隔5秒重复调用一次javascript“success”回调

如果调用repeat,然后在调用echo之后的某个时间点,echo方法中的DispatchCommandResult将导致调用echo success和repeat success回调,然后阻止进一步的repeat success回调,因为KeepCallback未设置为true

在Android中,这个问题不是问题,因为Cordova提供了callbackId。但是,对于Windows Phone,无法访问callbackId

C#代码

名称空间Cordova.Extension.Commands
{
公共类Echo:BaseCommand
{
公共空回显(字符串选项)
{
字符串optVal=JsonHelper.Deserialize(选项)[0];
DispatchCommandResult(新的PluginResult(PluginResult.Status.OK,optVal));
}
公共无效重复(字符串选项)
{
字符串optVal=JsonHelper.Deserialize(选项)[0];
ThreadStart worker=()=>
{
尝试
{
while(true)
{
睡眠(5000);
PluginResult r=新的PluginResult(PluginResult.Status.OK,optVal);
r、 KeepCallback=true;
调度命令结果(r);
}
}
捕获(例外情况除外)
{
DispatchCommandResult(新的PluginResult(PluginResult.Status.ERROR,ex.Message));
}
};
新线程(worker.Start();
}
}
}
JavaScript代码

函数echo(){
功能成功(消息){
日志(“回显成功:+消息”);
}
函数错误(e){
控制台日志(“回显错误:+e”);
}
exec(成功,错误,“Echo”,“Echo”,“Hello”);
}
函数重复(){
功能成功(消息){
console.log(“重复成功:+消息”);
}
函数错误(e){
日志(“重复错误:+e”);
}
exec(成功,错误,“Echo”,“repeat”,“再次打招呼]);
}
回声();
.
.
.
重复();
.
.
.
回声();
样本输出

Log:"echo success: Hello"
Log:"repeat success: Hello again"
Log:"repeat success: Hello again"
Log:"repeat success: Hello again"
Log:"repeat success: Hello again"
Log:"repeat success: Hello"
Log:"echo success: Hello"

还有其他人有这个问题吗?如果是,是否有解决办法?我做错了什么吗?

我对cordova 2.5也有同样的问题,这就是我发现的

在(尚未发布)2.8版本的cordova中,如果您查看cordovalib文件的。您可以看到一个
CurrentCommandCallbackId
,该ID可用于跟踪要调用的回调

然后,如果将KeepCallback设置为false,则可以将该命令分派给想要的回调

PhoneGap的当前版本是2.7.0,因此要使用它,您必须克隆并复制
模板/standalone
文件夹的
插件
cordova
cordivalib
的内容

完成后,您可以将此新功能与以下内容一起使用:

private void DispatchMessage(PluginResult.Status status, string message, bool keepCallback, string callBackID)
{
    PluginResult res = new PluginResult(status, message);
    res.KeepCallback = keepCallback;
    DispatchCommandResult(res, callBackID);
}

但是,一旦Phonegap 2.8发布,使用官方版本的Cordova更新应用程序会更安全。

您找到解决方案了吗?