Ответ 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.