API知识库 > API技术 > 同步API vs 异步API:理解并选择适合你业务的调用方式
同步API vs 异步API:理解并选择适合你业务的调用方式

同步API vs 异步API:理解并选择适合你业务的调用方式

同样的API接口,根据其不同的操作顺序能为开发者带来怎样的帮助呢?

同步API的意思是只有当前API执行完成后,才能继续执行下一个API。按照“console.log(“before”);”——“console.log(“after”);”的顺序进行,通俗意义上讲,这就好比到餐馆点餐时,一个指定的服务员被分配来为你服务,当点完餐时,服务员将订单送到厨房并在厨房等待厨师制作菜着,当厨师将菜着烹饪完成后,服务员将菜着送到你的面前,至此服务完成,此时这个服务员才能服务另外的客人。

同步模式是指一个服务员某一时间段只能服务于一个客人的模式;而异步API的意思是当前API的执行不会阻塞后续代码的执行。“console.log(“before”);”、“setTimeout(() => {”、“    console.log(“last”);”、“}, 2000);”、“console.log(“after”);”,所有程序可以同时进行,通俗意义上讲,这就好比到餐馆点餐时,在点餐后服务员将你的订单送到厨房,此时服务员没有在厨房等待厨师烹饪菜着,而是去服务了其他客人,当厨师将你的菜着烹饪好后,服务员再将菜着送到你的面前。异步模式是指一个服务员同时可以服务多个客人的模式。

同步API和异步API在使用中,有以下几个基本的区别

1、获取返回值

同步API可以直接从返回值中拿到API执行的结果,但是异步API是不可以的,异步API不会阻塞后面代码的执行。

// 同步

function sum(n1, n2) {    return n1 + n2;}const result = sum(10, 20);

// 异步

function getMsg() {    setTimeout(function () {        return { msg: "Hello Node.js" };    }, 2000);}const msg = getMsg();

2、代码执行顺序

司步API从上到下依次执行,前面代码会阻塞后面代码的执行;异步API不会等待API执行完成后再向下执行代码。

for (var i = 0; i < 100000; i++) {    console.log(i);}console.log("for循环后面的代码");

异步API不会等待API执行完成后再向下执行代码

console.log("代码开始执行");setTimeout(() => {    console.log("2秒后执行的代码");}, 2000);setTimeout(() => {    console.log('"0秒"后执行的代码');}, 0);console.log("代码结束执行");

3、回调函数

自己定义的函数让别人去调用

// getData函数定义

function getData(callback) {}

// getData函数调用

getData(() => {});

4、使用回调函数获取异步API执行结果

function getMsg(callback) {    setTimeout(function () {        callback({ msg: "Hello Node.js" });    }, 2000);}getMsg(function (msg) {    console.log(msg);});

5、代码执行顺序分析

console.log("代码开始执行");setTimeout(() => {    console.log("2秒后执行的代码");}, 2000);setTimeout(() => {    console.log('"0秒"后执行的代码');}, 0);console.log("代码结束执行");

6、Node.js中的异步API

fs.readFile("./demo.txt", (err, result) => {});var server = http.createServer();server.on("request", (req, res) => {});

二者在实际应用上,根据业务场景的不同,有着以下区别。

1.长时间运行操作场景中,异步API更占优势。

以需要长时间运行的业务为例,假设开发者正在构建一个使用机器学习来检测博客帖子情绪的 SaaS,开发者需要提交一个指向该博客帖子的链接,该服务将分析该帖子的情绪并将其返回。这个操作可能需要几秒甚至一分钟才能完成。可是这个时间太慢了,对于用户来说,如果不能在 5 秒内做出响应,就会失去耐心。因此,需要一个理解长时间运行操作概念的 API。

若使用同步 API设计,它的操作流程会是

“curl -X POST -H “Content-Type: application/json” -d ‘{“url”: “https://www.wundergraph.com/blog/long_running_operations”}’ http://localhost:3000/api/v1/analyze_sentiment”

最终的响应结果是

“{ “status”: “success”,  “data”: {   “url”: “https://www.wundergraph.com/blog/long_running_oerations”,    “sentiment”: “positive”  }}”

此操作可能需要很长时间才能完成,并且用户可能会取消它。

若使用异步 REST API设计,开发者需要返回具有唯一标识符的响应,以便客户端可以轮询服务器以获取结果。设计此类 API 的正确方法是返回 202 Accepted 状态代码。

因此开发者最终获得的响应效果将是一个带有状态代码 202 和响应。此刻,客户端可以使用以下命令来获取作业的状态:

curl http://localhost:3000/api/v1/analyze_sentiment/1/status

意味着 API 的调用者可以及时获取作业的当前状态或取消它。

随着平台功能的发展,用户群体对精准度更高的同步API需求同步增长。

以 Unity 首选的资源管理工具Addressable Asset System为例,它虽然可以将资源的引用和打包分开处理,加快运行模式下和运行版本的项目迭代。但是现有的许多Unity 用户开发的游戏不会有远程下载内容的需要,意味着异步行为在其它项目中反而会变成约束。因此,开发者需要新添功能更专一、准确化程度更高的同步 API。

假设开发者新添加了Synchronous Addressables API,在 1.17.4 版的 Addressables 包中可以使用,兼容 Unity 2021.1、Unity 2020 LTS 和 Unity 2019 LTS。在有了新的 API 后,项目不必调整为异步加载就能用上 Addressables 了。同步行为在函数中以 AsyncOperationHandle 的 WaitForCompletion 方法表示,该方法会返回同步运算的结果。

开发者可以先声明 Addressables.LoadAssetAsync<GameObject>(“MyPrefab”),返回 GameObject 运算的开关 AsyncOperationHandle<GameObject>。这时再声明 WaitForCompletion 会让系统阻拦代码执行,直到资源加载完成。在加载完成后,WaitForCompletion 便会返回代码请求的 GameObject。完成对异步和同步的同步运算。

事实上,在大部分实例中,同步加载的性能可比肩异步加载。而且同步加载的准确性更高。

在物联网应用中,二者的使用都有自己的优势

从联网汽车和恒温器到智能交通信号灯和农场的作物管理,物联网被用在各种部署中。物联网设备通常会生成大量实时数据,并使用流技术来保存这些数据。但这并不适用于向最终用户提供数据,因为物联网设备本身缺乏一种有效、安全的方法来将其数据公开给想要查看或分析数据的用户。幸运的是,这种情况正在改变。随着事件原生 API 和API 网关的出现,可以根据数据消费者的需求,同步和异步地从 IoT 设备(以及各种其他资源)公开数据。

同步 API 是一种通过请求-响应模型公开数据的 API。当数据仅定期更改和/或当数据消费者不需要持续更新的信息流时,这种方法可以根据数据消费者的请求数据进行响应,比如构建一个报告室外温度的应用程序,同步 API 可以实时报告数据;但是,如果处于数据不断变化的环境内,异步API 会是更好的选择,比如流经管道的水量或机器人在工厂车间的位置不断变化,使用异步 API,流数据可以通过 API 公开。这样,数据消费者可以使用 API 调用访问持续更新的数据流,而无需直接连接到后端数据流。

参考链接:

https://mp.weixin.qq.com/s/bvoIptd7YwU45icqvoqokg

https://mp.weixin.qq.com/s/9c11pJ5d1nbE2vmGvCDwmQ

https://blog.csdn.net/cz_00001/article/details/132837290

https://mp.weixin.qq.com/s/OjmnK8LST7IavP5-9ByZZA

https://mp.weixin.qq.com/s/kw3huYO3XXtx30RCfwheAg

#你可能也喜欢这些API文章!