Promise(javascript) and Task(C#)
如何转变异步与同步的思维模式
同步方法就像一个工人,调用者需要将原料给他,并看着这个工人工作直到做出我们需要的产品,而异步方法则是准备一个工厂(Promise对象或者Task对象),我们只需要将原料放到工厂的入口,然后看着原料经过一些预处理(异步方法的await之前或者返回Promise之前的非耗时部分)送往工人,然后工厂给我们一个用来取产品的凭证(Promise对象或者Task对象),然后就可以去干其他事情了,当我们需要完成品的时候,就去工厂拿着凭证等着我们需要的结果(Javascript和C#中的await),或者直接将用来下一步处理产品的工厂入口(回调函数)告诉现在的工厂(Promise的then回调和C#的回调委托),这样将一个一个工厂串联起来,就成了异步调用,需要注意的是,一般来说只要我们使用了异步这个工厂,那么在默认情况下我们自己也就成了一个工厂,在我们的工厂内第一次遇到异步调用时,我们的工厂的调用者也就可以不再等我们完成结果了(在await处返回Promise或者Task对象),C#和Javascript所不同的是,C#可以在同步方法中直接等待异步的结果而不立即返回Task对象(使用Task.Result),但是一般来说Javascript不管是使用Promise.then还是await都会立即返回Promise,除非你不关心运行的结果如何(拿到Promise对象后什么都不做)。
所以,当我们集齐原料的时候,就可以将原料送往工厂,然后拿着凭证做其他的事情,如果有不需要我们的干预就可以处理的部分,就可以注册为回调函数,也就是变相的延长了工厂的长度,在需要结果的时候去拿着凭证等待结果(或者是回调),以此类推。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 kuroneko's blog!