Что жасмин работает и ждет? На самом деле?
Я использую запуск жасмина и жду, чтобы проверить асинхронные операции. Все работает отлично, но я не совсем уверен, что происходит за кулисами.
В документации по жасмину указан следующий пример, в который я добавил три оператора журнала.
describe("Asynchronous specs", function() {
var value, flag;
it("should support async execution of test preparation and exepectations", function() {
runs(function() {
flag = false;
value = 0;
setTimeout(function() {
flag = true;
}, 500);
});
waitsFor(function() {
value++;
if(flag) {
console.log("A");
}
return flag;
}, "The Value should be incremented", 750);
console.log("B");
runs(function() {
console.log("C");
expect(value).toBeGreaterThan(0);
});
});
});
});
Первые runs
и waitsFor
для меня совершенно ясны. runs
запускает асинхронную операцию, а waitsFor
ждет условие.
Однако я не понимаю, почему второй runs
не запускается до завершения waitsFor
. waitsFor
не является блокирующим вызовом.
Я предполагаю, что waitsFor
неявно блокирует любой следующий вызов runs
до его завершения. Это так?
Мое свидетельство заключается в том, что вывод команд console.log:
B A C
Но если waitsFor
действительно блокирует, он должен быть
A B C
Ответы
Ответ 1
waitsFor
блокируется до тех пор, пока не будут выполнены ожидаемые условия или время ожидания.
Из jasmine docs: "waitsFor() обеспечивает лучший интерфейс для приостановки вашей спецификации до завершения какой-либо другой работы. Жасмин будет ждать до тех пор, пока предоставленная функция возвращает true, прежде чем продолжить следующий блок.".
Связанные документы также имеют несколько более четкий пример или waitsFor
.
EDIT: А теперь я понимаю, что вы имеете в виду. waitsFor
не будет блокировать JS, который не завернут в runs
, waitsFor
, ect.
Что жасмин делает, это передать функцию, переданную ей через runs
или waitsFor
, и если жасмин в настоящее время не ждет, он немедленно выполняет эту функцию. Если он ждет, он не вызывает его, пока он не закончит ожидание.
Это не останавливает console.log
, поскольку оно передается жасмину, поэтому жасмин не может помешать ему немедленно выполнить его.
Ответ 2
Решение находится в документации:
Несколько циклов run() в спецификации будут запускаться последовательно. (Документация Жасмина)
Ответ 3
С сайта: http://www.htmlgoodies.com/beyond/javascript/test-asynchronous-methods-using-the-jasmine-runs-and-waitfor-methods.html#fbid=mzNDUVfhFXg
Жасмин будет вызывать методы run() и waitsFor() в том порядке, в котором вы передал их. Как только парсер JS дойдет до метода waitsFor(), он будет опросить его до тех пор, пока он не вернет true, и только тогда он продолжит следующий метод run().
По сути, функции run() и waitsFor() заполняют массив своими предоставленными функциями. Затем массив обрабатывается jamine, в котором функции вызывается последовательно. Ожидается, что те функции, которые были зарегистрированы run(), будут выполнять фактическую работу, в то время как те, которые зарегистрированы waititsFor(), будут функционировать "защелки" и будут опрошены (вызваны) каждые 10 мс до тех пор, пока они не вернутся к истине или не истечет время регистрации в факультативном периоде. Если период ожидания истекает, сообщается об ошибке с использованием необязательного зарегистрированного сообщения об ошибке; в противном случае процесс продолжается со следующей функцией в массиве. Предположительно, ожидания в рамках run() также могут инициировать отчет об отказе (и, возможно, даже в самих функциях защелки).
Документация особенно тупо по этим асинхронным функциям.