Подтвердить что ты не робот

Как я могу реализовать обещание/отсрочку?

Я хочу написать шаблон Promise/Deffered. Идеальный вариант в конце:

MyObject().CallMethodReturningPromise()
   .done( result => {
       ...something doing;
   } )
   .fail( error => {
       ...error handle;
   } )
   .always( () => {
       ...some code;
   } )

Я нашел эту реализацию https://bitbucket.org/mattkotsenas/c-promises/overview и https://gist.github.com/cuppster/3612000. Но как я могу использовать его для решения моей задачи?

4b9b3361

Ответ 1

С# решает это с помощью Task s

Задачи решают ту же проблему, что и promises в JavaScript, и вы можете использовать их аналогично. Как правило, вы не должны.

Существует несколько отличий:

  • Задачи имеют встроенную отмену.
  • Задачи не всегда запускаются, и вы можете выполнять задачи и запускать их позже.
  • Promises выполнить ассимиляцию, вы не можете иметь Promise<Promise<T>>, но у вас может быть задача задачи на С# и может потребоваться вызвать .Unwrap для задач.
  • Существует одна каноническая реализация задач в TPL (библиотека распараллеливания задач), которая поставляется с С#, но во многих реализациях promises в JavaScript.

Использование задач

Здесь вы можете использовать их с синтаксисом async/await, который будет добавлен в JavaScript в ES7 и может использоваться в ES6 с yield в некоторых библиотеках.

async Task Foo(){
    try{
        var res = await myObject.CallMethodReturningTaskOrAsyncMethod();
        doSomethingWithResponse(res);
    } catch(e){
         // handle errors, this will be called if the async task errors
    } finally {
        // this is your .always
    }
}

Вы также можете использовать .ContinueWith, который параллелен .then, но это очень редко встречается на С# и, как правило, неодобрительно, когда ожидание может использоваться. Вы можете узнать больше о с помощью async/await здесь.

Deffereds сопоставляются с экземплярами TaskCompletionSource, а Promise - Task в С#. Task.WhenAll используется там, где вы использовали бы $.when или Promise.all.

Где вы обычно пишете:

a().then(function(res){
    return b(res, "foo");
}).then(function(res2){
    // do work on res2
});

В С# вы сделаете следующее:

var res = await a();
var res2 = await b(res, "foo");
// do work on res2.

Ответ 2

Мне кажется, это идеально подходит для задач:

var deferred = Task
    .Factory
    .StartNew(() => /* produce some result (promise) */);

// done
deferred
    .ContinueWith(d => Console.WriteLine(d.Result), TaskContinuationOptions.OnlyOnRanToCompletion);

// fail
deferred
    .ContinueWith(d => Console.WriteLine(d.Exception), TaskContinuationOptions.OnlyOnFaulted);

// always
deferred
    .ContinueWith(d => Console.WriteLine("Do something"));

Ответ 3

вы можете использовать асинхронный с Task, async и ждать следующим образом: Обратите внимание, что для обработки асинхронных данных вам не нужно использовать try catch

 public async Task Method()
   {
     await Task.Run(() =>
            {
                //operations
                Application.Current.Dispatcher.Invoke(() =>
                {
                    //grab the UI Dispatcher if you need
                });
            }).ContinueWith(task =>
            {
                if (task.IsCompleted)
                {
                    //operations success
                }
                else if (task.IsFaulted)
                {
                    //operations failed
                }
            });
        }