【问题标题】:Variable Scope Dojo xhrPost可变范围 Dojo xhrPost
【发布时间】:2013-09-10 22:14:23
【问题描述】:

免责声明 - 我已经查看了现有的 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 开发工具中引发以下错误 - Uncaught TypeError: Object [object Object] has no method 'getPicklist'。

我还错过了什么?谢谢。

【问题讨论】:

  • 不知道为什么你在 args 中有 dojo.toJson 函数,它不需要。
  • 另外,取决于您使用 getPickList 函数的方式,您使用的延迟将不起作用。因为 getPickList 函数将在延迟 then 执行之前很久就退出。您是 ajax 函数有问题,还是没有将值作为返回值
  • @tik27 获取价值作为回报。我在 JS 框架(argos-sdk)的上下文中调用它并尝试动态命名文本框。根据它的文档,这样做的方法是通过 this.getPicklist().bindDelegate() 之类的方法。然而,函数本身总是返回一个空字符串,所以我认为我有一些范围问题。
  • 你用的是什么版本的道场?

标签: javascript dojo saleslogix


【解决方案1】:

不是在getPicklist 的末尾返回picklistName,而是需要返回一个promise——这里是then() 的结果——并添加一个回调,当延迟解决。

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
    });

【讨论】:

  • 我已按照您的建议进行了改进,但仍然出现错误。您在响应底部指出的第二个函数返回一个匿名对象,但我仍然缺少一些东西。感谢您提供任何额外的见解。
  • 如果正在调用错误处理程序,这意味着请求或回调中出现了问题。我会通过在回调中记录data 来开始调试,看看它是否真的在触发并从那里继续前进。
  • 除非您指的是第二个代码块,在这种情况下,我不确定您所说的“返回匿名对象”是什么意思。你能澄清一下吗?
猜你喜欢
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多