Можно ли протестировать последовательность вызовов асинхронных функций с помощью DOH?
Я пытаюсь использовать doh.Deferred, чтобы написать тест, который будет проверять следующую последовательность событий:
- войти с пользователем 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;
}
1 ответ
Решение
Это работает. Сфера применения 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;
}