使用cordova(3.x)插件时无法拦截javascript回调

Posted

技术标签:

【中文标题】使用cordova(3.x)插件时无法拦截javascript回调【英文标题】:Cant intercept javascript callbacks when using cordova (3.x) plugin 【发布时间】:2014-03-12 00:44:13 【问题描述】:

我目前正在使用一个使用 Audiostreamer 框架来控制和流式传输音频的 cordova 插件。我希望在我的应用程序的主要 javascript 代码中拦截从插件的 js 部分发送的回调,例如“pause_success”。当 a 调用插件的 pause 方法时:

[Error] TypeError: 'undefined' is not a function (evaluating 'window.plugins.stream.pause_success()')
    global code (index.html, line 1)

我试过了:

window.plugins.stream.pause_success = function(success)
    if(success)
        alert('success');
    

;

什么都不做

和:

window.plugins.stream.pause_success(function ()
    if(success)
        alert('success');
    

);

这会导致以下错误

[Error] RangeError: Maximum call stack size exceeded.
    pause_success (StreamManager.js, line 60)
    pause_success (StreamManager.js, line 60)
    pause_success (StreamManager.js, line 60)
    pause_success (StreamManager.js, line 60)
    pause_success (StreamManager.js, line 60)
    pause_success (StreamManager.js, line 60)
    pause_success (StreamManager.js, line 60)
    pause_success (StreamManager.js, line 60)
    pause_success (StreamManager.js, line 60)
    pause_success (StreamManager.js, line 60)
    pause_success (StreamManager.js, line 60)
    pause_success (StreamManager.js, line 60)
    etc etc

插件端成功回调的代码如下:

StreamManager.prototype.pause_success = function()
      if(this.pause_success)
        this.pause_success();
      
    

实际暂停功能如下:

StreamManager.prototype.pause = function(options, success, fail)
  this.pause_success = success;
  this.pause_error = fail;
    cordova.exec(null, null, "Stream", "pause", [options]);

有谁知道拦截这些回调的正确方法,还是只是插件方面做得不正确?

插件库可以在这里找到:https://github.com/feedhenry/fh-cordova-plugin-stream

感谢您的宝贵时间。

【问题讨论】:

我不知道这个插件,但据我了解和其他插件的工作原理一样,它的作用是调用您在调用动作函数时定义的成功和失败回调函数,所以为什么是否要拦截回调? 好吧,例如,当音频成功开始播放时,我希望更新应用程序控件,暂停时同上,当歌曲结束或出错时,我想调用下一首曲目并执行预取操作。这就是为什么我想在我的主应用程序中指定回调行为:) 【参考方案1】:

我的理解(但我也不知道这个插件)是你应该调用动作函数并将动作的名称传递给它,一个回调在成功的情况下调用,一个回调在失败的情况下调用.

由于插件调用了你指定的回调,所以你不需要修改插件的函数或尝试拦截回调。

例如,它可能看起来像这样:

function pauseSuccess()
    alert("pause success!")

function pauseError()
    alert("pause error!")

function pause()
    StreamManager.action(act:'pause',pauseSuccess,pauseError);

【讨论】:

啊,一个很好的建议!我唯一的问题是这将在实际插件的 javascript 逻辑端完成,它无法访问主应用程序的功能。 一点也不,这是调用插件的工作方式。您在您的应用程序中而不是在插件代码中执行此操作。你给插件引用回调函数,插件使用这些引用在完成时调用函数。

以上是关于使用cordova(3.x)插件时无法拦截javascript回调的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Cordova/Phonegap 中编辑自定义 Java 插件

Cordova 插件:无法检索图片的路径

Apache Cordova 无法加载插件

Cordova 插件无法加载

如何使用sdk创建cordova插件

Cordova App 无法使用人行横道插件安装 64Bit APK