Promise.then() 的任务等效方法是什么?

31

通过在TypeScript中添加async / await,使用Promise的语法可以非常接近于使用Task。

示例:

Promise (TS)

public async myAsyncFun(): Promise<T> {
    let value: T = await ...
    return value;
}

任务(C#)

public async Task<T> MyAsyncFun() {
    T value = await ...
    return value;
}

我想知道是否有类似于.then()的等价方法可以用于Task(s)。

例子:

Promise(TS)

Promise<T> promise = ...
promise.then((result: T) => ...do something...);

请查看 Task 的连续性(https://msdn.microsoft.com/zh-cn/library/ee372288(v=vs.110).aspx)。还有一些其他有趣的方法,例如 When...()Wait...() 方法(https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task(v=vs.110).aspx)。 - KDecker
2个回答

23

那么它看起来会像这样: Task<T> task = await ... task.ContinueWith((task, result) => ...做某事...); - William Lohan
更新了我的回答。 - jdmdevdotnet
谢谢,抱歉我提交了我的第一个评论而没有完成它。 - William Lohan

1

您可以创建一个方便的扩展方法来匹配JavaScript中的.then函数,以进行任务继续。我发现它比.ContinueWith更容易使用,后者有其自己的一套问题和障碍。

public static class TaskExtensions
{
    public static async Task<TV> Then<T,TV>(this Task<T> task, Func<T,TV> then)
    {
        var result = await task;
        return then(result);
    }
}

然后你可以这样使用它

Task<User> userRecord = GetUserById(123)
Task<string> firstName = userRecord.Then(u => u.FirstName)

await task 可能需要使用 .ConfigureAwait(false) 进行配置,也可能不需要,这取决于您想在哪里调用 then lambda。因此,这不是一个适用于一般情况的好操作符。相关的 GitHub API 提案:Then or ContinueWithResult extension method for Task - Theodor Zoulias
如果您关心.ConfigureAwait,您可以向扩展方法添加一个可选参数。 - Andrew Richesson
可选参数的默认值是什么? - Theodor Zoulias
true since that's the default .ConfigureAwait value if you choose not to use .ConfigureAwait - Andrew Richesson
那样做就会与流行的Polly库的默认设置不一致。 - Theodor Zoulias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接