1

免責事項 - 既存の SO エントリを確認し、機能するはずなのに機能しないものをまとめました。

私は次の機能を持っています。基本的には、値のペアを Web サービスに送信し、結果を JSON で返します。

getPicklist: function () {
        var xhrArgs = {
            url: 'myUrl',
            postData: dojo.toJson({
                'opportunityId': 'myOppId',
                'loggedInUserId': 'myUserId' //App.context.user.$key
            }),
            headers: {
                "Content-Type": "application/json"
            }
        }
        var deferred = dojo.xhrPost(xhrArgs);
        deferred.then(
                    function (data) {
                        var jsonResponse = dojo.fromJson(data);
                        picklistName = jsonResponse.PicklistName;

                        if (!picklistName) {
                            picklistName = "defaultPickListName";
                        }
                        return picklistName;
                    },
                function (error) {
                    alert("Could not load picklist " + error);
                });
        ;
        //return picklistName; -- null
    }

これを読んだ後の私の理解: xhrpost dojo を使用した匿名 js 関数がデータを返さない

dojo.deferred を使用するとともに、この関数のスコープ外に変数を追加すると、問題が解決するのでしょうか。関数の外に var を配置して、オブジェクトを picklistName 変数に割り当ててみました。

ただし、この関数の結果 (picklistName 変数) をまだ取得できません。

誰かが私が間違っていることと、それを修正する方法を明確にしてもらえますか?

編集 - Thomas Upton が提案した変更を行った後、私は近づいていますが、奇妙なエラーが発生しています。

getPicklist の後に次の関数を追加しました。

    returnPicklistName: function () {
        this.getPicklist().then(function (picklistName) {
            return picklistName;
        })
    },

私が本当に欲しいのはピックリストだけだからです(本当に欲しいJSONがありますが、今はピックリストだけで解決します)。

これにより、Chrome 開発ツールで次のエラーがスローされます - Uncaught TypeError: Object [object Object] has no method 'getPicklist'.

私は他に何を逃したのですか?ありがとう。

4

1 に答える 1

1

picklistNameの最後に戻る代わりに、 promise (ここでは の結果)getPicklistを返し、遅延が解決されたときに を受け取るコールバックを追加する必要があります。then()picklistName

getPicklist: function () {
    // ...
    var deferred = dojo.xhrPost(xhrArgs);
    return deferred.then(
        function(data) { /* get picklistName from data */ return picklistName; },
        function(error) { /* ... */ }
    );
}

次に、呼び出すとgetPicklist

this.getPicklist()
    .then(function(picklistName) {
        // Use picklistName here
    });
于 2013-09-10T22:30:29.383 に答える