2013-05-06 14 views
18

Używam jaśminów i czekam na testy operacji asynchronicznych. Wszystko działa dobrze, ale nie jestem do końca pewien, co dzieje się za kulisami.Co jaśmin działa i czeka?

W dokumentacji jaśminu podano następujący przykład, do którego dodałem trzy instrukcje dziennika.

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); 
    }); 
    }); 
}); 

});

Pierwsze runs i waitsFor są dla mnie zupełnie jasne. Runs uruchamia operację asynchroniczną, a waitsFor czeka na warunek.

Jednak nie rozumiem, dlaczego drugi runs nie rozpocznie się, dopóki nie zostanie zakończone waitsFor. waitsFor nie jest połączeniem blokującym.

Domyślam się, że waitsFor niejawnie blokuje każde następne wywołanie runs, dopóki nie zostanie zakończone. Czy tak jest?

Mam dowody, że console.log wyjście oświadczenia:

BAC

Ale jeśli waitsFor naprawdę zablokować powinny być

ABC

Odpowiedz

17

waitsFor ma blok aż warunkach to czeka są spełnione lub wygasają.

Z : "WaitsFor() zapewnia lepszy interfejs do wstrzymania specyfikacji, aż do zakończenia jakiejś innej pracy Jasmine będzie czekać, aż podana funkcja zwróci wartość true, zanim przejdzie do następnego bloku.".

Połączone dokumenty mają również nieco bardziej przejrzysty przykład lub waitsFor.

EDYTOWANIE: Ah Widzę, co masz teraz na myśli. waitsFor nie blokuje JS, który nie jest opakowany w runs, waitsFor, ect.

Jaśmin robi się przejąć funkcję przekazaną do niego przez runs lub waitsFor, a jeśli jaśmin nie jest obecnie czeka, natychmiast wykonuje funkcję. Jeśli to czeka, nie wywołuje go, dopóki nie skończy się czekanie.

To nie powstrzymuje console.log, ponieważ zostało przekazane jaśminowi, więc jaśmin nie może zapobiec natychmiastowemu wykonaniu.

+0

Jestem pewien, że tak nie jest. Umieszczasz instrukcję pomiędzy 'waitsFor' i drugim' run', które zostaną wykonane przed kodem w 'waitFor'. Zaktualizuję moje pytanie, aby to odzwierciedlić. –

+0

Ale dzięki za link do dokumentacji, nie wiedziałem o tym :) –

+0

I jeszcze raz dziękuję, odpowiedź jest w dokumentach, ale nie całkiem, gdzie wskazałeś :) –

2

Z witryny: http://www.htmlgoodies.com/beyond/javascript/test-asynchronous-methods-using-the-jasmine-runs-and-waitfor-methods.html#fbid=mzNDUVfhFXg

Jasmine wezwie tras() i waitsFor() metod w kolejności je przeszedł.Gdy tylko parser JS wykona metodę waitsFor(), ankieta odpytuje, dopóki nie zwróci wartości true i tylko wtedy będzie kontynuowała następną metodę run().

Zasadniczo funkcje run() i waitsFor() wypychają tablicę z dostarczonymi funkcjami. Tablica jest następnie przetwarzana przez jaminę, przy czym funkcje są wywoływane sekwencyjnie. Te funkcje zarejestrowane przez runs() powinny wykonywać rzeczywistą pracę, podczas gdy te zarejestrowane przez waitFor() mają być funkcjami "zatrzaskowymi" i będą odpytywane (wywoływane) co 10ms, dopóki nie zwrócą wartości true lub upłynie opcjonalny zarejestrowany limit czasu. Jeśli upłynął limit czasu, zgłaszany jest błąd za pomocą opcjonalnego zarejestrowanego komunikatu o błędzie; w przeciwnym razie proces będzie kontynuowany z następną funkcją w tablicy. Można przypuszczać, że w ramach run() może również wywołać raport o błędzie (a może nawet same funkcje blokowania).

Dokumentacja jest wyjątkowo rozwarta w przypadku tych asynchronicznych funkcji.

+1

Jasmine 1.3 zapewnia waitFor-methods (not waitFor) odpowiedź powinna zostać poprawiona. – florianb

Powiązane problemy