经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
JavaScript同步与异步任务问题详解
来源:jb51  时间:2022/7/19 13:02:56  对本文有异议

js会出现异步问题场景

  • 延时操作
  • 数据请求同异步
  • promise 异步
  • 回调涵数(最常见多内置涵数支持接收回调涵数来异步代码 )
  • 事件监听 如,click事件等异步
  • 订阅与发布

今天遇到的问题是,请求数据时间太长,会先执行之后的代码,

初步预想的解决方法:

  • 使用箭头涵数,使用涵数的返回值,让请求与之后的代码 同步执行
  • 异步请求修改变成同步
  • async/await-Promise-让异步操作同步执行
  • 开关涵数
  • 延时操作

标题延时操作

缺点:不知请求数据需要多长时间,之后的数据需要延迟多少时间展示,是个问题。

  1. function tes0t() {
  2. fn1();
  3. fn2();
  4. fn3();
  5. }
  6. function fn1() {
  7. console.log(1);
  8. }
  9. function fn2() {
  10. setTimeout(function () {
  11. console.log(2);
  12. }, 1000);
  13. }
  14. function fn3() {
  15. setTimeout(function () {
  16. console.log(3);
  17. }, 0);
  18. }
  19. tes0t();

开关涵数

预期输出是:1,2,3,

实际输出是:1,3,2,

所以达不到想要的效果

  1. var kai=false
  2. function tes0t() {
  3. fn1();
  4. fn2();
  5. fn3();
  6. }
  7. function fn1() {
  8. console.log(1);
  9. }
  10. function fn2() {
  11. setTimeout(function () {
  12. console.log(2);
  13. kai= true;
  14. }, 1000);
  15. // console.log();
  16. }
  17. function fn3() {
  18. setTimeout(function () {
  19. console.log(3);
  20. }, 0);
  21. }
  22. tes0t();

jQuery异步请求设置为同步请求

是否达到预期效果,不知道

  1. $.ajaxSettings.async = false;//同步请求
  2. Global_MBPage.$gt(url, params, function (json) {}
  3. $.ajaxSettings.async = true;//异步请求 - 默认是异步

使用箭头涵数,涵数的返回值,让请求与之后的代码 同步执行

测试是可以达到预期效果,输出结果是1,2,3

  1. function tes0t() {
  2. fn1();
  3. fn2(1, 1, () => {fn3();});
  4. }
  5. function fn1() {
  6. console.log(1);
  7. }
  8. function fn2(n1, n2, n3) {
  9. setTimeout(function () {
  10. console.log(2);
  11. if (n3) n3.call();//返回值的设置
  12. }, 1000);
  13. }
  14. function fn3() {
  15. setTimeout(function () {
  16. console.log(3);
  17. }, 0);
  18. }
  19. tes0t();

async/await-Promise-让异步操作同步执行

  1. function fn4(){
  2. return new Promise(resolve=>{
  3. setTimeout(function(){
  4. msg='等啥 '
  5. resolve(msg)
  6. },1000)
  7. })
  8. }
  9. async function aC(){
  10. var result = await fn4();
  11. console.log(result);
  12. }
  13. aC()

// 输出为‘ 等啥 ’

到此这篇关于JavaScript同步与异步任务问题详解的文章就介绍到这了,更多相关JavaScript同步与异步 内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号