2013-01-19 45 views
0

我正在創建一個帶有動態TAB(來自RESTful的數據)的Web應用程序,每個TAB都有一個dgrid,我也從RESTful中獲取列以及從RESTful中獲取行。我使用XHR和MemoryStore完成了所有工作,但是現在我需要從XHR更改爲JsonRest,因爲我需要將HTTP範圍傳遞給服務器。如何使用Dojo組織異步代碼?

我有困難組織我的代碼與在Dojo中的異步調用。我會給你一個例子:

method1() - Sync 
method2() - Async (JsonRest) 
method3() - Sync 

只有在method2()準備好後才能執行method3()的最佳方法?

我找到了一個叫做WHEN的類。看起來不錯。但是,您如何使用dojo中的異步應用程序?

我現在最大的問題是:我無法通過方法分離我的代碼,我需要將我所有的代碼放入JsonRest的promise函數(THEN)中。因爲在那裏我不能訪問另一種方法。

回答

2

我同意使用Dojo的promise實現的建議。

如果您不習慣承諾:這可能會幫助您更快地瞭解它:http://jsfiddle.net/27jyf/9/。另一個很好的功能是錯誤處理,我會鼓勵你在基本排序完成後閱讀。

require(["dojo/Deferred", "dojo/when"], function(Deferred, when) { 
    var sayHello = function() { return 'hello' }; 
    var sayWorld = function() { 
     var deferred = new Deferred();   
     window.setTimeout(function() { 
      deferred.resolve('world'); 
     }, 1000);   
     return deferred.promise; 
    }; 
    var sayBang = function() { return '!' }; 

    //This will echo 'hello world !' 
    //That's probably how you want to sequence your methods here 
    var message = []; 
    message.push(sayHello()); 
    sayWorld().then(function(part) { 
     message.push(part); 
     message.push(sayBang()); 
     console.debug(message.join(' ')); 
    });  

    //This will also echo 'hello world !' 
    //This probably not the syntax that you want here, 
    //but it shows how to sequence promises and what 'when' actually does 
    var message2 = []; 
    when(sayHello()) 
    .then(function(part) { 
     message2.push(part); 
     return sayWorld(); 
    }) 
    .then(function(part) { 
     message2.push(part); 
     return when(sayBang()); 
    }) 
    .then(function(part) { 
     message2.push(part); 
     console.debug(message2.join(' ')); 
    }); 

    //Provided the behavior observed above, this will echo 'hello !' 
    //dojo/when allows you to use the same syntax for sync and async... 
    //but it does not let you magically write async operations in a sync syntax 
    //'world' will be pushed into the array a second later, after the message has already been echoed 
    var message3 = []; 
    message3.push(sayHello()); 
    when(sayWorld(), function(part) { 
     message3.push(part); 
    }); 
    message3.push(sayBang()); 
    console.debug(message3.join(' ')); 
}); 
+0

請注意,JsonRest實際上使用承諾API本身。所以你可以使用var promise = myJsonRest.get(); (function(){/ * my success behavior * /},function(){/ * my failure behavior * /}); – Andrew