Javascript 是否可以使用D.O.H测试异步函数调用序列

Javascript 是否可以使用D.O.H测试异步函数调用序列,javascript,testing,dojo,doh,Javascript,Testing,Dojo,Doh,我正在尝试使用编写一个测试,该测试将检查以下事件序列: 使用用户A登录(异步) 注销(同步) 使用用户A登录(异步) 第二个回调函数的返回值是另一个doh.Deferred对象。我的印象是d的回调链将等待d2,但它不会。测试在调用d2.callback之前完成 我哪里出了问题 有人知道我有更好的方法来测试这种行为吗 function test() { var d = new doh.Deferred(); d.addCallback(function() {

我正在尝试使用编写一个测试,该测试将检查以下事件序列:

  • 使用用户A登录(异步)
  • 注销(同步)
  • 使用用户A登录(异步)
  • 第二个回调函数的返回值是另一个doh.Deferred对象。我的印象是d的回调链将等待d2,但它不会。测试在调用d2.callback之前完成

    我哪里出了问题

    有人知道我有更好的方法来测试这种行为吗

    function test() {
        var d = new doh.Deferred();
    
        d.addCallback(function() {  
            Comm.logout(); /* synchronus */
            try {   
                // check with doh.t and doh.is
                return true;
            } catch (e) {
                d.errback(e);
            }
        });
    
        d.addCallback(function() {
            var d2 = new dojo.Deferred();
            /* asynchronus - third parameter is a callback */
            Comm.login('alex', 'asdf', function(result, msg) {
                    try {
                        // check with doh.t and doh.is
                        d2.callback(true);
                    } catch (e) {
                        d2.errback(e);
                    }                   
                });
            return d2; // returning doh.Defferred -- expect d to wait for d2.callback
        });     
    
        /* asynchronus - third parameter is a callback */
        Comm.login('larry', '123', function (result, msg) {
            try {
                // check with doh.t and doh.is 
                d.callback(true);
            } catch (e) {
                d.errback(e);
            }
        }); 
    
        return d;
    }
    

    这很有效。d2的范围就是问题所在

    function test() {
        var d = new doh.Deferred();
        var d2 = new doh.Deferred();
    
        d.addCallback(function() {  
            Comm.logout(); /* synchronus */
            try {   
                    // check with doh.t and doh.is
                    return true;
            } catch (e) {
                    d.errback(e);
            }
        });
    
        d.addCallback(function() {
            /* asynchronus - third parameter is a callback */
            Comm.login('alex', 'asdf', function(result, msg) {
                            try {
                                    // check with doh.t and doh.is
                                    d2.callback(true);
                            } catch (e) {
                                    d2.errback(e);
                            }                                       
                    });
            return d2; // returning doh.Deferred -- waits for d2.callback
        });         
    
        /* asynchronus - third parameter is a callback */
        Comm.login('larry', '123', function (result, msg) {
            try {
                    // check with doh.t and doh.is 
                    d.callback(true);
            } catch (e) {
                    d.errback(e);
            }
        }); 
    
        return d;
    }