2012-11-15 19 views
1

我是很新的道场,但我有一定的误差处理延迟API我不禁道场/递延链机制不尊重异步调用

我调用的代码是

function openEditor(id, fieldName) { 
    editOptionsDialog_fetchData(id, fieldName).then(function(data){ 
    console.log("done!"); 
    }); 
    console.log("leaving openEditor!"); 
} 

调用该函数

function editOptionsDialog_fetchData(id, fieldName) { 
    require(["dojo/ready", "dojo/data/ObjectStore", "dojo/Deferred"], function(ready,  ObjectStore, Deferred) { 
     var store; 
     var def; 

     switch (fieldName) { 
      case "degree": 
       store = new degreeStore(); 
       def = store.getJsonData(); 
       break; 
      case "faculty": 
       store = new facultyStore(); 
       def = store.getJsonData(); 
       break; 
      default: 
       console.log("error in editOptionsDialog_fetchData: " + fieldName); 
     } 

     return def.then(function(data){ 
      store.data = data.items; 
      editOptionsDialog_select.setStore(new ObjectStore({ objectStore : store })); 
      editOptionsDialog_select.store.query({ "id" : id }); 
      editOptionsDialog_select.startup(); 
     }); 
    }); 
} 

其中store.getJsonData()创建一个延迟,我想使用链接递延解决所(见正文后附加代码)。

我收到的错误是

editOptionsDialog_fetchData(id, fieldName).then(function(data)...) is undefined 

由于错误信息出现访问openEditor功能之后,很明显,该函数调用的值必须未定义,因为回调尚未完成。

我的问题是,在延迟API的误解必须在我的代码中,因为目的是评估editOptionsDialog ASON的函数调用,因为异步调用已完成并被调用支持,并且在此调用之前不存在完成(在函数调用仍然导致未定义的状态,但我认为这是当时返回的目的)。

THX对您有所帮助

---附加代码getJsonData()---

getJsonData: function() { 
     return xhr(this.handlerUrl, { 
      handleAs: "json", 
      method: "POST", 
      data: { 
       action: "getJsonData" 
      } 
     }).then(function(data){ 
      return data; 
     }, function(err){ 
      alert("Data cannot be fetched in degreeStore.getJsonData! " + err); 
     }); 
    } 

回答

0

通过重组代码解决了这个问题。原则上,延期对象似乎无法返回到不同的要求条款。因此,这个工作对我来说:

var editMultilanguageDialog_Startup; 
// one require-clause, wrapping all the Deferred-sensitive statements 
require(["dojo/request/xhr", "dojo/json", "dojo/Deferred", "dojo/store/Memory", "dojox/timing", "dojo/domReady!"], function(xhr, json, Deferred, Memory, timing, domReady) { 

    function editMultilanguageDialog_Startup(id, fieldName) { 
    // code from former mainForm -> moved into this require-clause 
    //[...] 
    // here, the invocation is no longer undefined and waits for the resolve   
    editMultilanguageDialog_fetchData(id, fieldName).then(function(data){ 
      //[...] 
      editMultilanguageDialog.show(); 
     });  
    } 

    function editMultilanguageDialog_fetchData(id, fieldName) { 
     // unchanged, returns Deferred 
    } 

}); 

这是一种解决方法,我不知道这个功能是目的而道场。

1

我创建了一个小提琴来证明你正在尝试做的。

基本上我从getJsonData返回推迟到editOptionsDialog_fetchData方法。 editOptionsDialog_fetchData创建另一个Deferred,它返回到openEditor。在editOptionsDialog_fetchData中,我将第一个Deferred的解析连接到解析第二个Deferred

http://jsfiddle.net/cswing/yUTT8/

+0

Sry,编辑!问题仍然没有解决... –

+0

我更新了我的答案。 –

+0

用于那个总结的坦克。在你的情况下,这个例子非常完美。但有一件事我没有明确提到的是,opensitor函数在fetchdata例程的独立require子句中。无论如何,这并没有让我清楚,为什么fetchData的调用发生得太早,因此不会返回延迟...导致不处理then方法。 –