0

ワークライト・アダプターを呼び出して、外部サービスを安静に呼び出しています。worklight メソッドの実行中WL.Client.invokeProcedure(invocationData,options)に、デバッグ領域で以下のエラーが発生しました:

'null' は 'in' の有効な引数ではありません"

以下は、どこで間違いを犯しているのかわからない私のアダプター呼び出しの実装です。

define(["dojo/_base/declare", "dojo/_base/lang", "dojo/_base/xhr",
     "dojo/_base/json", "dojo/_base/Deferred"], 
         function(declare,lang,xhr,json,Deferred) {

     return {
            mobGetLocationLatLng: function(pAddress) {          

                   console.log("+++adapter1.mobGetLocationLatLng+++pAddress" +
     pAddress );

         try{
            var invocationData = {
                    adapter : 'GeoCode',
                    procedure : 'getGmapLatLng',
                    parameters : [pAddress]
                    };

            console.log("+++about to invoke procedure+++"+ JSON.stringify(invocationData)); 
            WL.Client.invokeProcedure(invocationData,{
                onSuccess : this.gMapLatLngSuccess,
                onFailure : this.gMapLatLngFailure
            });
        }
        catch (e){
            console.log('Error...:' + e.message);
        }

    },
    gMapLatLngSuccess: function (result){
        console.log('Success:');
        console.log('<<<<<adapter1.result>>>>>>>>> ' + JSON.stringify(result.invocationResult));
        return result.invocationResult;
    },
    gMapLatLngFailure: function(){
        console.log('Failure');
    }
  };
});

誰でも助けることができますか?

4

1 に答える 1

2

テスト 1: アダプターが単独で機能することを証明する (JavaScript なし)

GeoCode アダプタ フォルダ > Deploy Adapter > Invoke Procedure > ... を右クリックしてみてください。

それは機能しますか?期待したものを返しますか?

テスト 2: アダプター呼び出しが単独で動作することを証明する (JavaScript)

(GeoCode アダプターにアクセスできる) 既存の Worklight プロジェクトの下に新しい Hybrid Worklight アプリケーション (wlapp) を作成してみてください > [開く] wlapp.js> 内部のすべてのコードを次のように置き換えます。

function wlCommonInit () {

    WL.Client.invokeProcedure({
        adapter : 'GeoCode',
        procedure : 'getGmapLatLng',
        parameters : ['hardcode_valid_value_here']
        },{
        onSuccess : function(res){ console.log('win', res); },
        onFailure : function(res){ console.log('fail', res); }
    });
}

注: 'hardcode_valid_value_here'有効な値に置き換える必要があります。

問題を切り分けてみてください。エラーを切り分けようとせずに、アプリからコードをコピーして貼り付けただけのようです。

それは機能しますか?期待したものを返しますか?

テスト 3: Worklight スクリプト タグに問題がないことを証明する

複数の HTML ページを使用している場合は、この StackOverflow の返信をご覧ください。単一の HTML ページ内にすべてが含まれている場合、それは機能しますか?

テスト 4: デバッガーを試す

Google Chrome を開く > WL コンソール (localhost:8080/console) を開く > 共通リソースとしてプレビューする >呼び出しにブレーク ポイントを追加するWL.Client.invokeProcedure> コードが実行され、ブレーク ポイントで停止することを確認する > コードのステップ イン/トラバースを続ける。問題の原因となっているコードを共有します。

上記のテストに基づいて、より多くの情報で質問を更新してください。

コードを書く他の方法

function wlCommonInit () {

//Define your LocationSingleton under myNameSpace
var myNameSpace = myNameSpace || {};
myNameSpace.LocationSingleton = (function ($) {

        //Private Members:
        var _getLocationFromAdapter = function (pAddress) {

            var deferred = $.Deferred(),

                    invocationData = {
                        adapter : 'GeoCode',
                        procedure : 'getGmapLatLng',
                        parameters : [pAddress]
                    },

                    success = function (res) {
                        console.log('Worked:', res);
                        deferred.resolve(res);
                    },

                    failure = function (err) {
                        console.log('Failed:', err);
                        deferred.reject(err);
                    };

                    console.log('Calling getLocationFromAdapter with:', invocationData);
                    WL.Client.invokeProcedure(invocationData, {
                        onSuccess : success,
                        onFailure : failure
                    });

                    return deferred.promise();
        };

        //Public API:
        return {
            getLocationFromAdapter : _getLocationFromAdapter
        };

}(WLJQ));


        //Usage: Calling the function and getting the location or a failure
        myNameSpace.LocationSingleton.getLocationFromAdapter('hardcode_valid_value_here')

        .then(function (res) {
            console.log('Done:', res);
        })

        .fail(function (err) {
            console.log('Err:', err);
        });

}
于 2013-05-02T01:59:27.640 に答える