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
    }

读完后我的理解: anonymous js function with xhrpost dojo not return data

是否在此函数范围之外添加变量以及使用 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

您需要返回一个promise——这里是结果——而不是picklistName在结束时返回,并添加一个回调,该回调将在deferred 解决时接收。getPicklistthen()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 回答