我遇到麻烦,从cordova插件(iOS版)中立即触发后续回调。 在XCode调试器中,我清楚地看到它跨越了
[self.commandDelegate sendPluginResult:pluginResult callbackId:monitoredRegions.callbackId];
几次(立即连续),每次都略有不同pluginResult
。
这是由
[locationManager requestStateForRegion:region];
我不会(并且无法控制)。
问题是,在Javascript方面,回调只被触发一次。
什么(实际上并非如此)奇怪的是,如果我在回调中引入一些阻塞,如alert()
,则回调会多次触发(如预期的那样)。这很酷,但我不需要应用中的任何alert()
。
如果我理解,commandDelegate
应该处理线程和排队,但似乎它没有。问题是,每次调用sendPluginResult
时如何触发JS回调。
非常感谢!
答案 0 :(得分:25)
因此,问题不在于线程/排队。
事实证明,只有才能使用callbackId
,除非告诉Cordova不要通过将callbackId
设置为{CDVPluginResult.keepCallback
来清除true
1}}。请注意keepCallback
不是BOOL
属性,因此您可能需要致电[pluginResult setKeepCallbackAsBool:YES];
CDVPluginResult* pluginResult = [sendPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:key];
[pluginResult setKeepCallbackAsBool:YES]; // here we tell Cordova not to cleanup the callback id after sendPluginResult()
[self.commandDelegate sendPluginResult:pluginResult callbackId:monitoredRegions.callbackId];
令人头疼的是,如果你在回调中引入了alert()
这样的屏蔽通话,Cordova会让你连续多次sendPluginResult
使用相同的callbackId
。
请注意,您可能需要sendPluginResult
CDVPluginResult
keepCallback
false
来callbackId
发布您不会{{1}}的{{1}}需要了。