可变范围Dojo xhrPost

时间:2013-09-10 22:14:23

标签: javascript dojo saleslogix

免责声明 - 我已经审核了现有的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
    }

阅读本文后我的理解: anonymous js function with xhrpost dojo not returning data

是否在此函数范围之外添加变量以及使用dojo.deferred会解决此问题。我尝试在函数外部放置一个var,并将该对象分配给picklistName变量。

但是,我仍然无法获得此函数的结果(picklistName变量)。

有人可以澄清我做错了什么,以及如何解决它?

编辑 - 托马斯厄普顿建议改变后,我更接近但我得到一个奇怪的错误。

我在getPicklist之后添加了以下函数:

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

因为我真正想要的只是选项列表(我想要的是JSON,但我现在只会选择这个选项列表)。

这会在Chrome开发工具中引发以下错误 - 未捕获TypeError:对象[object Object]没有方法'getPicklist'。

我还想念什么?感谢。

1 个答案:

答案 0 :(得分:1)

而不是在picklistName的末尾返回getPicklist,而是需要返回promise - 这里是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
    });