当前位置: 首页 > 知识库问答 >
问题:

javascript - js中,如何将异步操作变为同步?

爱花蜂
2023-07-15

经常看到的一个题目,特此求解
gpt的写法是:

  1. async/await
  2. callback function

共有2个答案

郗浩言
2023-07-15

如果题主意思是让异步代码有类似同步的样子

一般也就是那两三种

  • async

    function asyncFunction() {  return new Promise((resolve, reject) => {    // 模拟异步操作    setTimeout(() => {      const result = 'Hello, world!';      resolve(result);    }, 1000);  });}// 调用测试(async function() {  console.log('Start');  const result = await asyncFunction();  console.log('End');})();
  • 回调函数

    function asyncFunction(callback) {  // 模拟异步操作  setTimeout(() => {  const result = 'Hello, world!';  callback(result);  }, 1000);}// 调用测试(function syncFunction() {  console.log('Start');  asyncFunction(function(result) {  console.log(result);  console.log('End');  });})();
  • Generator生成器

    function asyncFunction() {  return new Promise((resolve, reject) => {    // 异步操作    setTimeout(() => {      const result = 'Hello, world!';      resolve(result);    }, 1000);  });}// 将异步操作封装在生成器中(不大推荐,不如上面两种简洁明了)function* syncFunction() {  console.log('Start');  const result = yield asyncFunction();  console.log(result);  console.log('End');}// 执行生成器函数(手动迭代)const generator = syncFunction();function handleAsync(iterator) {  const { value, done } = iterator.next();  if (done) return;  if (value instanceof Promise) {    value.then((result) => {      handleAsync(iterator);    }).catch((error) => {      console.error(error);    });  }}handleAsync(generator);
  • 借助第三方框架,例如:

    • synchronize.js
    • fibers.js
    • (不推荐)可能导致性能下降和代码可读性降低

如果题主的意思是把异步代码改造为同步

那就要把所有会触发异步的代码移除或修改(正常不会有这样丧心病狂的需求吧)

例如:

  • 定时器函数
  • 监听事件处理
  • async 函数和 Promise 对象
  • ...
第三方框架链接
synchronize
fibers
郦楷
2023-07-15

严格来说异步没有办法变为同步。更多时候提问者应该是想说让代码写起来像同步。那么这样其实就只有一种那就是async/await;因为其他的方式都不太像同步。宽泛点问应该是怎么设计一个异步逻辑。那就有很多种了。
1、回调函数
2、promise
3、队列。其实promise也是队列
4、promise+generator => async/await

 类似资料:
  • 问题内容: 我在创建的Web API中执行以下操作: 通过以下方式通过Jquery Ajax调用完成对此Web服务的调用: 我已经看到一些开发人员以这种方式实现了先前的操作: 不过,得说GetProductsWithHistory()是一个相当长的操作。考虑到我的问题和上下文,使webAPI操作异步将给我带来什么好处? 问题答案: 在您的特定示例中,该操作根本不是异步的,因此您正在执行的操作是异步

  • 我见过一些开发人员以这种方式实现前面的操作: 不过,不得不说,GetProductsWithHistory()是一个相当长的操作。考虑到我的问题和上下文,使webAPI操作异步对我有什么好处?

  • 概述 定时器 Promise 对象

  • 如果这被认为是一个可接受的实践,我需要什么-如果有-错误处理?我的理解是,task.wait()将重新抛出异步操作抛出的任何异常,并且我没有提供任何取消异步操作的机制。仅仅调用task.wait()就足够了吗?

  • 本文向大家介绍nodejs中require方法是同步还是异步操作?为什么?相关面试题,主要包含被问及nodejs中require方法是同步还是异步操作?为什么?时的应答技巧和注意事项,需要的朋友参考一下 同步 因为经常用到模块,并且一般都在模块顶端引入,所以把require做成同步,有助于代码整洁有序,增强可读性。 但是,I/O密集的地方尽量不要用require。所有的同步,都会阻塞Node,直到

  • 本文向大家介绍thinkjs之页面跳转同步异步操作,包括了thinkjs之页面跳转同步异步操作的使用技巧和注意事项,需要的朋友参考一下 对于刚入手thinkjs项目的新手来说,时常会犯的一个错误就是“混用”各种代码逻辑,比如:我们经常在做后台管理系统的时候用到的登录框, 其实它原本是有一个路由专门存放自己的代码逻辑,而在点击提交按钮的时候,要达到的效果便是账号密码正确的时候,正常跳转页面,而错误的