2011-06-08 40 views

cevap

6
Evet, reset Evet, iç içe olabilir ve evet, yararlı olabilir. Örnek olarak, GWT geliştiricilerinin doğrudan bir tarzda (Java için GWT'de kullanılan geri arama geçirme stilinin aksine) eşzamanlı olmayan RPC'leri (uzaktan yordam çağrıları) yazmasına olanak veren scalagwt project için bir API'yi prototipledim. Örneğin:
field1 = "starting up..."     // 1 
field2 = "starting up..."     // 2 
async {          // (reset) 
    val x = service.someAsyncMethod()  // 3 (shift) 
    field1 = x        // 5 
    async {         // (reset) 
     val y = service.anotherAsyncMethod() // 6 (shift) 
     field2 = y       // 8 
    } 
    field2 = "waiting..."     // 7 
} 
field1 = "waiting..."      // 4 

Yorumlar, yürütme sırasını gösterir. Burada, async yöntemi, bir reset gerçekleştirir ve her servis çağrısı bir shift gerçekleştirir (uygulamayı my github fork, özellikle Async.scala üzerinde görebilirsiniz).

Yuvalanmış async denetim akışını nasıl değiştirdiğine dikkat edin. Bu olmadan, field2 = "waiting" hattı, ikinci RPC'nin başarıyla tamamlanmasından sonra gerçekleştirilemez. RPC yapıldığında

, uygulama en iç async sınır kadar devam yakalar ve RPC başarıyla tamamlanması üzerine yürütülmesi için askıya alır. Böylece, iç içe geçmiş async bloğu, kontrolün ikinci RPC yapıldıktan hemen sonra hatta hemen akmasına izin verir. Bu iç içe geçmiş blok olmaksızın, devam, dış async bloğunun sonuna kadar devam edecek, bu durumda dış async içindeki tüm kodlar her bir RPC'de bloke olacaktır.

1

reset, bir kodun, içindeki kodun devam sihriyle uygulandığı gerçeğinden etkilenmeyecek şekilde bir soyutlama oluşturur. Bu nedenle, sıfırlama ve kaydırma ile kod yazıyorsanız, sıfırlama ve kaydırma ile de uygulanabilecek veya uygulanmayabilecek başka kodları da çağırabilir. Bu anlamda iç içe olabilirler.