免责声明-我已经审查了现有的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变量)。

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

编辑-做出更改后,托马斯·厄普顿(Thomas Upton)建议,我离得更近,但是我遇到了一个奇怪的错误。

我在getPicklist之后添加了以下功能:

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


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

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

我还想念什么?谢谢。

最佳答案

您需要返回一个promise(此处是picklistName的结果)并添加一个回调,该回调将在延迟解决时接收到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
    });

10-07 12:55