Search code examples
hybrid-mobile-appibm-mobilefirst

Preventing "onSuccess" firing when there is no connection to an adapter?


Using MobileFirst v6.3, whenever I communicate with an adapter using WL.Client.invokeProcedure, the onSuccess function ALWAYS fires, regardless of actual success or not. This includes when the mobile device is completely offline.

onConnectionFailure still functions as expected, firing after the adapter times out, but having onSuccess fire is essentially useless.

Sample code:

var invocationData = {
                    adapter : 'MaximoLogin',
                    procedure : 'setValue',
                    parameters : [itemid,value]
                };

WL.Client.invokeProcedure(invocationData, {
                onSuccess : valueSuccess(itemid),
                onConnectionFailure: connectivityFailure,
                onFailure : connectFailure
            });

How do I prevent this from happening?


Solution

  • You should update your code as follows:

    var invocationData = {
      adapter : 'MaximoLogin',
      procedure : 'setValue',
      parameters : [itemid,value]
    };
    
    WL.Client.invokeProcedure(invocationData, {
      onSuccess : valueSuccess,
      onConnectionFailure: connectivityFailure,
      onFailure : connectFailure,
      invocationContext : {
        itemid: itemid
      }
    });
    
    // your success function
    function valueSuccess(response) {
      // get the item id from the invocationContext object
      var successItemId = response.invocationContext.itemid;
    
      // handle your success ...
    }
    

    The reason why your valueSuccess function is always called is because you are always calling it i.e.: valueSuccess(itemid). onSuccess takes a callback function and you are invoking the function that's why it always runs.

    If you want to pass some variable to your callback functions you use invocationContext which is an object that will be passed to your callback functions both onSuccess and onFailure.