Tag: 承诺

Promise.defer的正确模式是什么?

我正在使用TypeScript和async / await来表示异步工作流。 该工作流程的一部分是呼叫Web工作者,并在回调结果时继续。 在C#中,我创建了一个TaskCompletionSource , await它的Task ,代码中的其他地方会调用SetResult来解析TaskCompletionSource 。 我可以在JavaScript中做同样的事情,通过使用Promise.defer()初始化Deferrer对象, await其Promise和其他地方,在window.onmessage监听器中将调用resolve (或reject )方法让异步工作流继续。 听起来很可爱,但MDN说defer已经过时了。 使用Promise构造函数的提议解决方案使Promise执行工作并调用resolve / reject方法对我不起作用,因为该逻辑可能超出我的范围,我只想在对象上调用resolve或reject on在一个完全不同的词汇范围内,我不能用那个function做到这一点。 有一个向后兼容的帮助器 ,它通过绑定我可以使用的resolve和reject函数来给我这样的对象,而无需查询我的代码的语义。 但这是一种不好的做法吗? 有没有公​​认的,更好的模式? 什么是JavaScript中TaskCompletionSource的惯用等价物?

我可以等待我用发电机创建的可枚举数吗?

假设我有异步获得的整数序列。 async Task GetI(int i){ return await Task.Delay(1000).ContinueWith(x => i); } 我想在该序列上创建一个生成器,如果序列是同步的,我会这样做: IEnumerable Method() { for (var i = 0; i < 100; i++) { yield return GetI(i); // won't work, since getI returns a task } } 所以,我认为类比是让生成器异步并从中产生: async Task<IEnumerable> Method() { for (var i = 0; i i); } } 这不起作用,因为带有yield的方法必须返回一个IEnumerable的东西,替代方案,更有意义的是IEnumerable<Task>但由于async方法必须返回Task s或void,因此无法编译。 现在,我意识到我可以简单地删除await并返回一个IEnumerable<Task>但这对我没有帮助,因为迭代会在任何数据准备就绪之前继续询问数据,所以它不能解决我的问题。 […]