0

我正在创建一个带有动态 TAB(来自 RESTful 的数据)的 webapp,每个 TAB 都有一个 dgrid,我从 RESTful 中获取列,从 RESTful 中获取行。我用 XHR 和 MemoryStore 让一切都很好,但我现在需要从 XHR 更改为 JsonRest,因为我需要向服务器传递一个 HTTP Range。

我很难在 Dojo 中使用异步调用来组织我的代码。我给你举个例子:

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

只有在 method2() 准备好之后,才执行 method3() 的最佳方式是什么?

我找到了一个名为 WHEN 的类。看起来不错。但是您如何在 dojo 中使用异步应用程序?

我现在最大的问题:我不能按方法分离我的代码,我需要把我所有的代码放在 JsonRest 的 promise 函数中(THEN)。因为在 THEN 里面我不能访问另一个方法。

4

2 回答 2

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

您可以使用promise api以指定的顺序运行 async/sync 方法。

于 2013-01-19T16:40:32.300 回答