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

Javascript Cordova:如何将多个onSuccess值解析为一个函数,javascript,function,cordova,geolocation,Javascript,Function,Cordova,Geolocation,我正在编写一个html/js脚本,其中包含三个onSuccess例程,分别来自navigator.compass.watchHeading、navigator.geolocation.watchPosition和navigator.accelerator.watchAcceleration 我想解析所有三个onSuccess值,比如positionLat=position.coords.latitude等转换到另一个函数以执行进一步操作 实现这一点的最佳/快速方法是什么?是否可以在不影响脚本的情

我正在编写一个html/js脚本,其中包含三个onSuccess例程,分别来自
navigator.compass.watchHeading
navigator.geolocation.watchPosition
navigator.accelerator.watchAcceleration

我想解析所有三个onSuccess值,比如
positionLat=position.coords.latitude等转换到另一个函数以执行进一步操作


实现这一点的最佳/快速方法是什么?是否可以在不影响脚本的情况下从这三个函数调用相同的函数?如果调用函数,如何将其他值解析为函数?

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

简单方法 在
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!==未定义&&obj.x!==未定义&&obj.magneticeReading!==未定义){/*…*/}(从您的第一个答案)这样的解决方案应该是?@Harry一点也不。每个订阅在不同的时间返回自己的数据。他们不是一下子来的,而是随机来的。如果您想在一个回调中捕获所有内容,我将使用
Promise.all
function onSuccess(type, obj) {
    switch (type) {                             
       case "geolocation":
          // obj.magneticHeading
       break;
       case "accelerometer":
          //...
       break;
        default:
          //.. not supported

    }
 }