Cordova:如何将多个 onSuccess 值解析为函数

Posted

技术标签:

【中文标题】Cordova:如何将多个 onSuccess 值解析为函数【英文标题】:Cordova: how to parse multiple onSuccess values to a function 【发布时间】:2017-09-06 18:28:38 【问题描述】:

我正在使用来自navigator.compass.watchHeadingnavigator.geolocation.watchPositionnavigator.accelerometer.watchAcceleration 的三个 onSuccess 例程编写一个 html/js 脚本。

我想将所有三个 onSuccess 值(如 positionLat = position.coords.latitude; 等)解析到另一个函数,以便在其中一个发生变化时采取进一步行动。

最好/最快的方法是什么?是否可以从所有三个调用相同的函数而不会困扰脚本?如果调用它,如何将其他值解析为函数?

【问题讨论】:

【参考方案1】:

是的,您可以对所有 3 个调用使用相同的成功和错误回调:

简单的方法

var watchIdAcceleration = navigator.accelerometer.watchAcceleration(onSuccess,
                                              onError,
                                              accelerationOptions);
var watchIdPosition = navigator.geolocation.watchPosition(onSuccess,
                                              onError,
                                              geolocationOptions);
 //...

onSuccess 中,您会获得不同的对象结构,因此很容易识别您是从哪里获得的:

function onSuccess(obj) 
    if(obj.coords !== undefined)/* ... */            //position
    else if(obj.x !== undefined)/* ... */                 //acceleration
    else if(obj.magneticHeading !== undefined) /* ... */  //compass
 

返回类型方式

但我相信这种方式会更清晰:

var watchIdAcceleration = navigator.accelerometer.watchAcceleration(
          function(data)
             onSuccess("accelerometer", data);
          , onError, accelerationOptions);

var watchIdPosition = navigator.geolocation.watchPosition(
          function(data)
             onSuccess("geolocation", data);
          ,onError,geolocationOptions);
 //...

所以在onSuccess 回调中,我们可以按类型使用switch

function onSuccess(type, obj) 
    switch (type)                              
       case "geolocation":
          // obj.magneticHeading
       break;
       case "accelerometer":
          //...
       break;
        default:
          //.. not supported

    
 

【讨论】:

好的,谢谢,所以当我只想在所有三个都成功时运行该函数时,例如 if(obj.coords !== undefined && obj.x !== undefined && obj.magneticHeading !== undefined) /* ... */(来自您的第一个答案)应该是解决方案吗? @Harry 一点也不。每个订阅在不同的时间返回他自己的数据。他们不是一下子来的,而是随机的。如果您想在一个回调中捕获所有内容,我会使用Promise.all:developer.mozilla.org/en-US/docs/Web/javascript/Reference/…

以上是关于Cordova:如何将多个 onSuccess 值解析为函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PhoneGap Geolocation onSuccess 从来没有第一次触发?

Cordova geolocation.getCurrentPosition()在调用3次后停止工作

音频在后台播放但没有声音 Cordova 3+ IOS

如何使用 Cordova 将动态数据从表单传递到 Firestore?

在 GWT 异步回调中,如何在 onSuccess 中处理相同的返回类型?

仅在 useMutation 成功执行后如何使用 apolloClient 的“onSuccess”