我怎样才能实现模式承诺/推迟?

时间:2014-10-01 07:38:52

标签: c# promise

我想写一个Promise / Deferred模式。 最终的完美变体是:

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

已找到此实施https://bitbucket.org/mattkotsenas/c-promises/overviewhttps://gist.github.com/cuppster/3612000。但是我怎么能用它来解决我的任务?

3 个答案:

答案 0 :(得分:48)

C#用Task s

解决了这个问题

任务解决了与JavaScript中的承诺相同的问题 - 您可以类似地使用它们。但通常情况下,你不应该这样做。

有几点不同:

  • 任务已内置取消。
  • 任务始终没有启动,您可以拥有任务并在以后启动它们。
  • Promise执行同化,你不能拥有Promise<Promise<T>>但是你可以在C#中执行任务,可能需要在任务上调用.Unwrap
  • 在TPL(任务并行化库)中有一个规范的任务实现,它附带了C#,但许多JavaScript中的promise实现。

使用任务

以下是使用async/await语法的方法 - 这些语法将添加到ES7中的JavaScript中,并且可以在某些库中使用yield的ES6中使用。< / p>

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

你也可以use .ContinueWith.then相提并论,但它在C#中非常罕见,并且在使用await时通常不赞成。您可以详细了解using async/await here

Deffereds映射到TaskCompletionSource个实例,而Promise是{C}的Task个。在您使用Task.WhenAll$.when的地方使用Promise.all

您经常写的地方:

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

您在C#中执行以下操作:

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

答案 1 :(得分:28)

对我来说,这完全符合tasks

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

答案 2 :(得分:0)

您可以使用异步与任务异步等待,如下所示: 注意处理异步你不需要使用try catch

$(function(){
    $('#select_field').change(function(){
        var itemVal = $(this).val();
        if(itemVal != ''){
            $('#register2').removeAttr('disabled');
        }
        else{
            $('#register2').attr('disabled', 'disabled');
        }
    });
});
相关问题