我想写一个Promise / Deferred模式。 最终的完美变体是:
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。但是我怎么能用它来解决我的任务?
答案 0 :(得分:48)
Task
s 任务解决了与JavaScript中的承诺相同的问题 - 您可以类似地使用它们。但通常情况下,你不应该这样做。
有几点不同:
Promise<Promise<T>>
但是你可以在C#中执行任务,可能需要在任务上调用.Unwrap
。以下是使用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');
}
});
});