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 < 10;i++) console.log(i)for(var i = 10;i < 20;i++) console.log(i)以上两个for循环,第一个打印1-10,第二个打印10-20,结果是1-20按顺序输出 js中代码是同步执行的,只有在ajax的情况下,会导致代码执行顺序...
<JS篇> 异步函数执行顺序问题
在给出的示例中,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循环执行不会等待你的异步函数回调之后再执行。你可以把循环改成回调的方式;