Cordova 插件从本机函数获取异步响应

Posted

技术标签:

【中文标题】Cordova 插件从本机函数获取异步响应【英文标题】:Cordova plugin get the async response from native function 【发布时间】:2020-11-08 01:48:23 【问题描述】:

就我而言,我想构建一个简单的插件:

    启动原生页面 (用户输入后)回调到cordova(js)

我没有找到处理回调的方法。 我搜索了科尔多瓦文档(Echo 示例),第一部分非常简单。但是,它没有提到异步回调。

【问题讨论】:

【参考方案1】:

您可以通过同步发送“无结果”响应并保留 Cordova 回调来发送异步响应,以便与它一起发送异步结果。 例如:

安卓:


public class MyPlugin extends CordovaPlugin 
    
    private static CallbackContext myAsyncCallbackContext = null;

    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException 
        if (action.equals("myAsyncFunction")) 
            // save the callback context
            someCallbackContext = myAsyncCallbackContext; 
            
            // Send no result for synchronous callback
            PluginResult pluginresult = new PluginResult(PluginResult.Status.NO_RESULT);
            pluginresult.setKeepCallback(true);
            callbackContext.sendPluginResult(pluginresult);
        
        return true;
    


    // Some async callback
    public void onSomeAsyncResult(String someResult) 
        if(myAsyncCallbackContext != null)
            // Send async result
            myAsyncCallbackContext.success(someResult);
            myAsyncCallbackContext = null;
        
    


ios


@interface MyPlugin : CDVPlugin
- (void)myAsyncFunction:(CDVInvokedUrlCommand *)command;
@end


@implementation MyPlugin

static NSString* myAsyncCallbackId = nil;

- (void)myAsyncFunction:(CDVInvokedUrlCommand *)command 
    // save the id
    myAsyncCallbackId = command.callbackId;

    // Send no result for synchronous callback
    CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_NO_RESULT];
    [pluginResult setKeepCallbackAsBool:YES];
    [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];


// Some async callback
- (void) didReceiveSomeAsyncResult:(NSString *)someResult 
    if(myAsyncCallbackId != nil)
        // Send async result
        CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:someResult];
        [self.commandDelegate sendPluginResult:pluginResult callbackId:myAsyncCallbackId];
        myAsyncCallbackId = nil;
    


@end

【讨论】:

以上是关于Cordova 插件从本机函数获取异步响应的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Cordova 插件添加本机视图

来自 iOS 4.0.0 中 Native 的 Cordova 插件 Javascript 函数调用

适用于 android 的 Cordova '本机文件选择器'插件不起作用

通过 Cordova 插件从 Objective-C 调用 Javascript

如何从cordova 3.x调用本机函数

如何在本机反应中处理异步函数响应并保存在useState中?