Mercurial > pub > ImplabNet
comparison Implab/Promise.cs @ 75:4439140706d0 v2
major refactoring, added tasks support
author | cin |
---|---|
date | Wed, 10 Sep 2014 11:17:37 +0400 |
parents | c4140283575c |
children | c761fc982e1d |
comparison
equal
deleted
inserted
replaced
74:c4140283575c | 75:4439140706d0 |
---|---|
223 // сделано для возвращаемого типа void | 223 // сделано для возвращаемого типа void |
224 protected void InternalCancel() { | 224 protected void InternalCancel() { |
225 Cancel(); | 225 Cancel(); |
226 } | 226 } |
227 | 227 |
228 | |
229 public IPromise<T> Then(ResultHandler<T> success, ErrorHandler<T> error, Action cancel) { | |
230 if (success == null && error == null && cancel == null) | |
231 return this; | |
232 | |
233 var medium = new Promise<T>(this, true); | |
234 | |
235 AddHandler(success, error, cancel, medium); | |
236 | |
237 return medium; | |
238 } | |
239 | |
228 /// <summary> | 240 /// <summary> |
229 /// Adds new handlers to this promise. | 241 /// Adds new handlers to this promise. |
230 /// </summary> | 242 /// </summary> |
231 /// <param name="success">The handler of the successfully completed operation. | 243 /// <param name="success">The handler of the successfully completed operation. |
232 /// This handler will recieve an operation result as a parameter.</param> | 244 /// This handler will recieve an operation result as a parameter.</param> |
239 var medium = new Promise<T>(this, true); | 251 var medium = new Promise<T>(this, true); |
240 | 252 |
241 AddHandler(success, error, null, medium); | 253 AddHandler(success, error, null, medium); |
242 | 254 |
243 return medium; | 255 return medium; |
256 } | |
257 | |
258 public IPromise Then(Action success, ErrorHandler error, Action cancel) { | |
259 return Then( | |
260 x => success(), | |
261 e => { | |
262 error(e); | |
263 return default(T); | |
264 }, | |
265 cancel | |
266 ); | |
244 } | 267 } |
245 | 268 |
246 public IPromise Then(Action success, ErrorHandler error) { | 269 public IPromise Then(Action success, ErrorHandler error) { |
247 return Then( | 270 return Then( |
248 x => success(), | 271 x => success(), |
265 var medium = new Promise<T>(this, true); | 288 var medium = new Promise<T>(this, true); |
266 | 289 |
267 AddHandler(success, null, null, medium); | 290 AddHandler(success, null, null, medium); |
268 | 291 |
269 return medium; | 292 return medium; |
293 } | |
294 | |
295 public void Last(ResultHandler<T> success, ErrorHandler error, Action cancel) { | |
296 if (success == null && error == null && cancel == null) | |
297 return; | |
298 | |
299 ErrorHandler<T> errorHandler = null; | |
300 if (error != null) | |
301 errorHandler = err => { | |
302 error(err); | |
303 return default(T); | |
304 }; | |
305 AddHandler(success, errorHandler, cancel, null); | |
306 } | |
307 | |
308 public void Last(ResultHandler<T> success, ErrorHandler error) { | |
309 Last(success, error, null); | |
310 } | |
311 | |
312 public void Last(ResultHandler<T> success) { | |
313 Last(success, null, null); | |
314 } | |
315 | |
316 public void Last(Action success,ErrorHandler error, Action cancel) { | |
317 Last(x => success(), error, cancel); | |
318 } | |
319 | |
320 public void Last(Action success,ErrorHandler error) { | |
321 Last(x => success(), error, null); | |
322 } | |
323 | |
324 public void Last(Action success) { | |
325 Last(x => success(), null, null); | |
270 } | 326 } |
271 | 327 |
272 public IPromise Error(ErrorHandler error) { | 328 public IPromise Error(ErrorHandler error) { |
273 if (error == null) | 329 if (error == null) |
274 return this; | 330 return this; |
305 AddHandler(null, handler, null, medium); | 361 AddHandler(null, handler, null, medium); |
306 | 362 |
307 return medium; | 363 return medium; |
308 } | 364 } |
309 | 365 |
310 public IPromise<T> Anyway(Action handler) { | |
311 if (handler == null) | |
312 return this; | |
313 | |
314 var medium = new Promise<T>(this, true); | |
315 | |
316 AddHandler( | |
317 x => handler(), | |
318 e => { | |
319 handler(); | |
320 throw new TransientPromiseException(e); | |
321 }, | |
322 null, | |
323 medium | |
324 ); | |
325 | |
326 return medium; | |
327 } | |
328 | |
329 /// <summary> | 366 /// <summary> |
330 /// Позволяет преобразовать результат выполения операции к новому типу. | 367 /// Позволяет преобразовать результат выполения операции к новому типу. |
331 /// </summary> | 368 /// </summary> |
332 /// <typeparam name="TNew">Новый тип результата.</typeparam> | 369 /// <typeparam name="TNew">Новый тип результата.</typeparam> |
333 /// <param name="mapper">Преобразование результата к новому типу.</param> | 370 /// <param name="mapper">Преобразование результата к новому типу.</param> |
334 /// <param name="error">Обработчик ошибки. Данный обработчик получит | 371 /// <param name="error">Обработчик ошибки. Данный обработчик получит |
335 /// исключение возникшее при выполнении операции.</param> | 372 /// исключение возникшее при выполнении операции.</param> |
336 /// <returns>Новое обещание, которое будет выполнено при выполнении исходного обещания.</returns> | 373 /// <returns>Новое обещание, которое будет выполнено при выполнении исходного обещания.</returns> |
337 public IPromise<TNew> Map<TNew>(ResultMapper<T, TNew> mapper, ErrorHandler<T> error) { | 374 public IPromise<TNew> Then<TNew>(ResultMapper<T, TNew> mapper, ErrorHandler<T> error) { |
338 if (mapper == null) | 375 if (mapper == null) |
339 throw new ArgumentNullException("mapper"); | 376 throw new ArgumentNullException("mapper"); |
340 | 377 |
341 // создаем прицепленное обещание | 378 // создаем прицепленное обещание |
342 var chained = new Promise<TNew>(this, true); | 379 var chained = new Promise<TNew>(this, true); |
368 ); | 405 ); |
369 | 406 |
370 return chained; | 407 return chained; |
371 } | 408 } |
372 | 409 |
373 public IPromise<TNew> Map<TNew>(ResultMapper<T, TNew> mapper) { | 410 public IPromise<TNew> Then<TNew>(ResultMapper<T, TNew> mapper) { |
374 return Map(mapper, null); | 411 return Then(mapper, null); |
375 } | 412 } |
376 | 413 |
377 /// <summary> | 414 /// <summary> |
378 /// Сцепляет несколько аснхронных операций. Указанная асинхронная операция будет вызвана после | 415 /// Сцепляет несколько аснхронных операций. Указанная асинхронная операция будет вызвана после |
379 /// выполнения текущей, а результат текущей операции может быть использован для инициализации | 416 /// выполнения текущей, а результат текущей операции может быть использован для инициализации |
382 /// <typeparam name="TNew">Тип результата указанной асинхронной операции.</typeparam> | 419 /// <typeparam name="TNew">Тип результата указанной асинхронной операции.</typeparam> |
383 /// <param name="chained">Асинхронная операция, которая должна будет начаться после выполнения текущей.</param> | 420 /// <param name="chained">Асинхронная операция, которая должна будет начаться после выполнения текущей.</param> |
384 /// <param name="error">Обработчик ошибки. Данный обработчик получит | 421 /// <param name="error">Обработчик ошибки. Данный обработчик получит |
385 /// исключение возникшее при выполнении текуещй операции.</param> | 422 /// исключение возникшее при выполнении текуещй операции.</param> |
386 /// <returns>Новое обещание, которое будет выполнено по окончанию указанной аснхронной операции.</returns> | 423 /// <returns>Новое обещание, которое будет выполнено по окончанию указанной аснхронной операции.</returns> |
387 public IPromise<TNew> Chain<TNew>(ChainedOperation<T, TNew> chained, ErrorHandler<T> error) { | 424 public IPromise<TNew> Then<TNew>(ChainedOperation<T, TNew> chained, ErrorHandler<T> error) { |
388 | 425 |
389 // проблема в том, что на момент связывания еще не начата асинхронная операция, поэтому нужно | 426 // проблема в том, что на момент связывания еще не начата асинхронная операция, поэтому нужно |
390 // создать посредника, к которому будут подвызяваться следующие обработчики. | 427 // создать посредника, к которому будут подвызяваться следующие обработчики. |
391 // когда будет выполнена реальная асинхронная операция, она обратиться к посреднику, чтобы | 428 // когда будет выполнена реальная асинхронная операция, она обратиться к посреднику, чтобы |
392 // передать через него результаты работы. | 429 // передать через него результаты работы. |
440 ); | 477 ); |
441 | 478 |
442 return medium; | 479 return medium; |
443 } | 480 } |
444 | 481 |
445 public IPromise<TNew> Chain<TNew>(ChainedOperation<T, TNew> chained) { | 482 public IPromise<TNew> Then<TNew>(ChainedOperation<T, TNew> chained) { |
446 return Chain(chained, null); | 483 return Then(chained, null); |
447 } | 484 } |
448 | 485 |
449 public IPromise<T> Cancelled(Action handler) { | 486 public IPromise<T> Cancelled(Action handler) { |
450 var medium = new Promise<T>(this, true); | 487 var medium = new Promise<T>(this, true); |
451 AddHandler(null, null, handler, medium); | 488 AddHandler(null, null, handler, medium); |
476 /// Преобразует результат обещания к нужному типу | 513 /// Преобразует результат обещания к нужному типу |
477 /// </summary> | 514 /// </summary> |
478 /// <typeparam name="T2"></typeparam> | 515 /// <typeparam name="T2"></typeparam> |
479 /// <returns></returns> | 516 /// <returns></returns> |
480 public IPromise<T2> Cast<T2>() { | 517 public IPromise<T2> Cast<T2>() { |
481 return Map(x => (T2)(object)x, null); | 518 return Then(x => (T2)(object)x, null); |
482 } | 519 } |
483 | 520 |
484 /// <summary> | 521 /// <summary> |
485 /// Дожидается отложенного обещания и в случае успеха, возвращает | 522 /// Дожидается отложенного обещания и в случае успеха, возвращает |
486 /// его, результат, в противном случае бросает исключение. | 523 /// его, результат, в противном случае бросает исключение. |
502 /// </remarks> | 539 /// </remarks> |
503 /// <param name="timeout">Время ожидания</param> | 540 /// <param name="timeout">Время ожидания</param> |
504 /// <returns>Результат выполнения обещания</returns> | 541 /// <returns>Результат выполнения обещания</returns> |
505 public T Join(int timeout) { | 542 public T Join(int timeout) { |
506 var evt = new ManualResetEvent(false); | 543 var evt = new ManualResetEvent(false); |
507 Anyway(() => evt.Set()); | 544 Finally(() => evt.Set()); |
508 Cancelled(() => evt.Set()); | |
509 | 545 |
510 if (!evt.WaitOne(timeout, true)) | 546 if (!evt.WaitOne(timeout, true)) |
511 throw new TimeoutException(); | 547 throw new TimeoutException(); |
512 | 548 |
513 switch (m_state) { | 549 switch (m_state) { |
702 | 738 |
703 IPromise IPromise.Error(ErrorHandler error) { | 739 IPromise IPromise.Error(ErrorHandler error) { |
704 return Error(error); | 740 return Error(error); |
705 } | 741 } |
706 | 742 |
707 IPromise IPromise.Anyway(Action handler) { | |
708 return Anyway(handler); | |
709 } | |
710 | |
711 IPromise IPromise.Finally(Action handler) { | 743 IPromise IPromise.Finally(Action handler) { |
712 return Finally(handler); | 744 return Finally(handler); |
713 } | 745 } |
714 | 746 |
715 IPromise IPromise.Cancelled(Action handler) { | 747 IPromise IPromise.Cancelled(Action handler) { |