2013-09-10 68 views
1

免責聲明 - 我已經檢查了現有的SO條目並拼湊了一些應該工作,但仍然沒有。變量範圍Dojo xhrPost

我有以下功能。在閱讀本後

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 
    } 

我的理解::基本上它發送一對值到一個web服務與回來在JSON結果 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開發工具中拋出以下錯誤 - Uncaught TypeError:Object [object Object] has no method'getPicklist'。

我還錯過了什麼?謝謝。

+0

。 – tik27

+0

也取決於你如何使用getPickList函數,延遲,因爲你使用它不會工作。因爲getPickList函數在延遲執行之前已經退出了很久。你是否遇到了ajax函數的問題,或者沒有獲得價值作爲回報 – tik27

+0

@ tik27將價值作爲回報。我在JS框架(argos-sdk)的上下文中調用此方法,並嘗試動態命名文本框。根據它的文檔,這樣做的方式是通過類似this.getPicklist()。bindDelegate()。然而,函數本身總是返回一個空字符串,所以我想我有一些範圍問題。 – Tek

回答

1

而是在getPicklist結束返回picklistName的,你需要返回一個promise - 在這裏,then()結果 - 並添加將接收picklistName的推遲做出決議時的回調。

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

然後,當你調用getPicklist

不知道爲什麼你在ARGS的dojo.toJson功能,它不需要
this.getPicklist() 
    .then(function(picklistName) { 
     // Use picklistName here 
    }); 
+0

我做了你所建議的改進,但我仍然收到錯誤。你在響應底部指出的第二個函數返回一個匿名對象,但我仍然缺少一些東西。感謝您的任何其他見解。 – Tek

+0

如果錯誤處理程序正在被調用,那意味着請求或回調中出現問題。我會通過在回調中記錄數據來開始調試,以確定它是否實際觸發並從那裏向前移動。 –

+0

除非你的意思是第二個代碼塊,在這種情況下,我不確定你的意思是「返回一個匿名對象」。你能澄清嗎? –