问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JS 怎么让整体的for同步执行而for中的异步函数异步执行

发布网友 发布时间:2022-04-07 08:58

我来回答

5个回答

懂视网 时间:2022-04-07 13:20

解决for循环中异步请求顺序不一致的问题

工作中遇到一个问题

for循环,再把循环出来的ID再进行二次请求

这就导致一个问题

请求结果返回顺序不一致

原因:异步请求会把回调事件放入微任务事件队列,宏任务执行完毕再执行微任务,具体参考事件队列机制

【相关课程推荐:JavaScript视频教程】

解决方法:

通过map方法进行循环请求

将异步请求方法封装起来,返回一个promise

这样将会返回一个具有多个promise的数组

通过promise.all()方法把promise包装成一个新的promise实例

// 通过Promise把所有的异步请求放进事件队列中
getInfo(item ,index) {
 const ms = 1000 * Math.ceil(Math.random() * 3)
 return new Promise((resolve,reject) => {
 setTimeout(() => {
  axios.get(id).then((result) => {
  resolve(result)
  })
 }, ms)
 })
}

// 返回多个promise
let promise = arr.map((item,index) = > {
 arr.forEach((item, index) => {
 return getInfo(item, index)
 })
})
// 对返回的promise数组进行操作
Peomise.all(promise).then((allData) => {
 arr.forEach((item, index) => {
 // ......
 })
})

本文来自 js教程 栏目,欢迎学习!

热心网友 时间:2022-04-07 10:28

看了你的问题,才百度学习的Promise,不知道是不是你要的效果。

   function async1(){
    return new Promise(function(resolve, reject) {
     setTimeout(function() {//setTimeout模拟异步
      console.log('async1 is done');
      resolve('async1 value');
     }, 6000);
    });
   }
   function async2(){
    return new Promise(function(resolve, reject) {
     setTimeout(function() {//setTimeout模拟异步
      console.log('async2 is done');
      resolve('async2 value');
     }, 3000);
    });
   }
   function async3(){//async3不需要then,所以没写return new Promise
    setTimeout(function() {
     console.log('async3 is done');
    }, 1000);
   }
   let p;
   for(let i=0;i<4;i++){
    p=async1().then(async2);
   }
   p.then(async3);

热心网友 时间:2022-04-07 11:46

function async1(callback){
    setTimeout(_ => {
        console.log('async1: ' + new Date().toTimeString());
        callback();
    }, 2000);
}

function async2(){
    return new Promise(resolve => {
        setTimeout(_ => {
            console.log('async2: ' + new Date().toTimeString());
            resolve();
        }, 2000);
    })
}

function async3(){
    return Promise.resolve().then( _ => console.log('async3: ' + new Date().toTimeString()));
}

//将async1封装为promise方式
function async1_promise(callback){
    return new Promise((resolve, reject) => {
        try{
            async1((...args) => {
                typeof callback === 'function' && callback.apply(null, args);
                resolve();
            });
        }catch(e){
            reject(e);
        }
    });
}

function test1(){
    //先执行4次async1,  执行完上1个再执行下一个
    //然后执行4次async2, 执行完上1个再执行下一个
    //再执行1次async3
    async1_promise()
        .then(_ => async1_promise())
        .then(_ => async1_promise())
        .then(_ => async1_promise())
        .then(_ => async2())
        .then(_ => async2())
        .then(_ => async2())
        .then(_ => async2())
        .then(_ => async3());
}

function test2(){
    //和test1相同, 只是写法简化, 如果要执行很多次可以这么写
    var step = Promise.resolve();
    for(let i = 0; i++ < 4; step = step.then(_ => async1_promise()));
    for(let i = 0; i++ < 4; step = step.then(_ => async2()));
    step.then(_ => async3());
}

function test3(){
    //先执行4次async1,  无需等待上1个执行完就执行下一个
    //然后执行4次async2, 无需等待上1个执行完就执行下一个
    //再执行1次async3
    Promise.all(Array.from(new Array(4), _ => async1_promise()))
        .then(_ => Promise.all(Array.from(new Array(4), _ => async2())))
        .then(_ => async3());
}

如果要测试,注意不要同时运行,  需要单独运行test1, test2, test3, 在浏览器控制台查看效果.

热心网友 时间:2022-04-07 13:20

function x(abc){
   for (let i = 0, k = 0; i < 4; i++){
      async1(success(){
         async2().then(()=>{
            if ( ++k == 4 ) abc();
         });
      });
   }
}
x(async3);

热心网友 时间:2022-04-07 15:12

function action(){
for(var a=0;a<5;a++){
action1();
}
}
function action1(){
console.log('haha');
}
整个for循环是同步执行的,但是action1()是异步执行的追问很感谢你的回答,但是恐怕你没get到点。以你写的代码为例,我需要在确保5次action1执行完毕之后执行代码,但是用Promise和await好像并不能达到要求。我需要的是类似如下代码:
action()
nextAction() //确保在action内部的5次action1()运行之后,才运行该函数
按照你现在提供的代码仍然会先运行nextAction()只要action1是个时间较久的异步函数

JS 怎么让整体的for同步执行而for中的异步函数异步执行

function async1(){ return new Promise(function(resolve, reject) { setTimeout(function() {//setTimeout模拟异步 console.log('async1 is done'); resolve('async1 value'); }, 6000); }); } function async2(){ return new Promise(function(resolve, reject...

js中for循环中需要调用异步方法,怎么确保执行的顺序

既然是异步,就不可能用for循环,因为for循环体中是没有办法暂停等待异步调用的。应该用函数递归的方式循环

js执行顺序+同步异步

按照js同步执行的顺序,函数调用会首先执行for循环,循环5次开启了5个延迟器,延时器内部的回调函数将会异步执行,会在延时1s后进入消息队列等待执行。循环了5次,所以此时i的值为5,然后同步执行console.log打印5,第一次同步执行结束,然后开始执行消息队列的异步任务,打印5个5,中间的undefined是函数调...

JS中如何解决for循环中的延迟执行问题

我们先来看一个例子 在JS方法里面设置一个for循环,输出每次循环的值,如下图 我们可以根据闭包的知识来更改一下for循环中的逻辑,利用闭包将i的值传递给a 这次在运行程序我们就可以看到输出内容是0开始输出了 结果如下图 JS中如果for循环中有异步方法,就需要用闭包的方式保留当前循环变量值 ...

怎么实现JS同步、异步、延迟加载

总结: 对于支持HTML5的浏览器,实现JS的异步加载只需要在script元素中加上async属性,为了兼容老版本的IE还需加上defer属性;对于不支持HTML5的浏览器(IE可以用defer实现),可以采用以上几种方法实现。原理基本上都是向DOM中写入script或者通过eval函数执行JS代码,你可以把它放在匿名函数中执行,也可以在onload中执行,也...

js的同步和异步

JavaScript的同步与异步实现JavaScript在编程中主要采用两种执行模式:同步和异步。同步模式意味着代码的执行顺序严格按照写入的顺序进行,遇到阻塞会暂停后续代码,直到完成。然而,这种模式的缺点在于,如果某个任务耗时较长,可能会阻塞整个程序,影响用户体验。相比之下,异步模式更为灵活。在异步模式下,当...

js 是同步执行 还是异步执行

你好,js是同步执行的,一个简单示例解释,for(var i = 0;i &lt; 10;i++) console.log(i)for(var i = 10;i &lt; 20;i++) console.log(i)以上两个for循环,第一个打印1-10,第二个打印10-20,结果是1-20按顺序输出 js中代码是同步执行的,只有在ajax的情况下,会导致代码执行顺序...

&lt;JS篇&gt; 异步函数执行顺序问题

在给出的示例中,for循环是第一个宏任务,它执行5次,每次循环结束后,将待执行的函数加入宏队列。首次执行时,由于没有微任务,直接进入下一个宏任务,打印出i(此时i为6)。每过一秒钟,setTimeout中的console.log(i)执行,由于作用域查找规则,始终找到的是全局i,因此每次输出6。解决这个问题的...

前端理解js中的同步和异步

JavaScript中常见的异步操作包括setTimeout/setInterval、AJAX、事件绑定(如on、bind、listen、addEventListener、observe)、观察者模式(例如在WebSocket中实现发布与订阅)、Promise、async/await和generator函数等。异步机制的实现依赖于任务队列和事件循环。异步任务首先被加入任务队列,等待执行。当主线程有空时...

为什么js第一个for循环没有执行完,就执行了第二个for循环?

那只能说明你for循环里的那个函数是异步的。for循环执行不会等待你的异步函数回调之后再执行。你可以把循环改成回调的方式;

pr怎么让素材整体后移 pr怎么让视频整体后移 怎么让文档整体变大 怎么能让塑料壳整体发光 怎么让照片整体变小 怎么让六倍镜整体变小 怎样让表格整体变大 电脑上表格怎样让它整体变大 如何让iphone整体显示变大
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
曾经万斗挂白樽,冷暖辛酸只自知,春蚓秋虫何日了,能甘寂寞是男儿... 怎么样将视频里的话音转录成音频文件呢?? 买本本 玩游戏【NBA2K,WOW~~~】 求推荐 价格4500以下 求4500左右的笔记本推荐 平时上网和游戏偏多 玩单机比较多 所以希望显 ... 你喜欢的偶像,做过哪些让自己骄傲的事情? 想买电脑主要用来玩游戏,用固态硬盘好还是机械硬盘好?固态硬盘太小内存... ...4000左右,能玩NBA2k11这样的游戏就行,还有就是携带方便点,因为我... 我大学生 准备买本本 平常玩玩NBA2K系列 炫舞 魔兽世界等游戏 我想买个笔记本电脑,主要玩大型硬盘单机游戏,求懂电脑的人给推荐下... CYMA 02 0540 001这块手表多少钱? 秘制腌制辣椒酱的做法步骤图,怎么做好吃 荀子树绿植无叶能成活吗? 这个季节栽荀子合适吗 荀子下山桩的栽培方法是什么? 荀子下山桩冬天套袋吗 荀子冬天开花还能结果吗 荀子在福建漳州能种植吗 荀子树怎么养 平枝荀子下山桩多久生根 阳台种植米叶珍珠荀子下山桩可以不? 荀子种植几年会开花结果? 昨天刚挖的荀子木怎样栽成活率高 下山桩荀子是白花好活还是红花好活? 下山荀子种多久才算成活 荀子下山桩的栽培方法是什么?适合怎样的环境? 旬子树下山好养吗? 厦门开出租车司机玩抖音投诉他会受什么处罚 抖音上认识一个厦门的女的让你炒外汇是不是骗子 有谁能整理一份抖音上的厦门热门景点呀? 抖音上经常出现的厦门景点,有谁知道都是哪儿吗? 2022央视春晚惊艳震撼中国风文化感满满,看完后你有什么想说的? “中国风”的定义是什么?是怎么由来的?谢谢了,大神帮忙啊 何为中国风? 小伙凭借中国风屡次获奖,中国风为何能征服世界? 中国风现在流行吗? 谈谈看你是如何理解中国风的? 中国风是怎么来的 中国风怎么理解? 5G网出了4G手机还值得买吗吗? 孕妇可以吃饭吗? 5G已经出来了,现在还有必要买4G手机吗? 《守望先锋》战网举报的流程与技巧 怎么在战网上举报人? 出了5G手机之后买4G手机还合算吗 画出完美口红有哪些方法? wow举报有用么 5g手机出来了,4g手里有买的必要么? 听说5g开始发展了,现在还买4g手机吗? 守望先锋怎么举报开挂玩家 5G手机出来4G还要买吗