同步调用是以一种阻塞式调用
比如说:古代的长城的烽火传递信息,现在我们假设每个烽火只能看到相邻的烽火状态,每个烽火的状态只有亮和暗。
现在有A、B、C、D四个烽火,A首先点亮,B看到A的烽火亮了,立马去点火,花了2秒点亮。但是这时候负责C烽火的人在睡觉,可是这时候所有人都在等待C点亮,终于C睡了2个小时候看到了B点亮,然后去点亮。D由于长期没有点亮,导致烽火出现问题,因此整个过程都在等待D的完成。这种就是典型的阻塞机制,无论如何我们只能等待上一个任务的完成,如果没有完成我们只能继续等待,这样造成的问题是,我们一直在浪费系统资源。
回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口
同样上面的例子:
现在我们还是A、B、C、D,但是A中有一个去B的信鸽(b),同样B中有(c),C中有(d)。现在我A收到消息后,我立马告诉信鸽b,然后自己去点亮烽火,信鸽会把信息带给B,B收到信鸽信息后立马点亮,然后放信鸽去C,C看到B点亮后立马告诉信鸽,之后点亮烽火,然后才收到信鸽c返回的信息,最后D收到信鸽,点亮烽火。
大家应该看到了,有两种做法,一种是我可以先放信鸽(也就是先执行回调函数,然后在继续执行下面的代码),再点亮烽火。同样可以先点亮烽火再放信鸽。
异步调用
异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。
依然是上面的例子:
现在我们有一个将臣F,他专门负责告诉每个烽火需要去点亮
A、B、C、D四个烽火,将臣先告诉了A,然后不等A点亮,他继续告诉了B、C和D。最后A在2小时后告诉了F我完成了,B在1小时后告诉了F我完成了,C在1.5小时后告诉F完成了,而D在3小时后告诉F完成了。F收到这些信息后,才知道整个过程完成了。