0

動的TAB(RESTfulからのデータ)を使用してWebアプリを作成しています。各TABにはdgridがあり、RESTfulから列を取得し、RESTfulから行も取得します。XHRとMemoryStoreですべてがうまく機能するようにしましたが、サーバーにHTTP範囲を渡す必要があるため、XHRからJsonRestに変更する必要があります。

Dojoで非同期呼び出しを使用してコードを整理するのが困難です。例を挙げましょう。

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

method2()の準備ができた後でのみ、method3()を実行するための最良の方法は何ですか?

WHENというクラスを見つけました。よさそうです。しかし、dojoでAsyncアプリをどのように操作しますか?

今の私の最大の問題は、コードをメソッドで分離できないことです。すべてのコードをJsonRestのpromise関数(THEN)内に配置する必要があります。THENの中では別のメソッドにアクセスできないからです。

4

2 に答える 2

2

私は、Dojo の promise 実装を使用するという推奨事項に同意します。

これは、promise に慣れていない場合に、理解を深めるのに役立つかもしれません: http://jsfiddle.net/27jyf/9/。これのもう 1 つの優れた機能はエラー処理です。基本的な順序付けが完了したら、これを読むことをお勧めします。

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(' '));
});
于 2013-01-19T21:04:44.817 に答える
1

promise apiを使用して、指定された順序で非同期/同期メソッドを実行できます。

于 2013-01-19T16:40:32.300 に答える