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

例如functionx(){returnnewPromise((resolve,reject)=>{for(leti=0;i<5;i++){async1(success(... 例如
function x()
{
return new Promise(
(resolve,reject)=>
{
for (let i = 0; i < 5; i++)
{
async1(
success()
{async2()
.then(
if(i==4) resolve()
)})
}
})
}
x().then(async3())

async1、2、3是异步函数
问题是,函数x会连续执行4次async1,然后直接执行async3,再回过去执行async2.
我希望能先执行4次async1然后4次async2,最后1次async3的顺序。
for内部异步函数执行顺序是无所谓的,重要的是函数x(即async1、2全部执行完毕)和async3的顺序。
换句话说执行到resolve才退出async1,进入async3。
async1用回调是因为这是个api不支持Promise
最好不要用递归,async await的写法也可以接受
网上没找到什么比较好的例子,有没有大神会修改一下代码啊
如果我说的不清楚的点,可以让我补充说明
展开
 我来答
WMYUOM
2019-06-05 · TA获得超过350个赞
知道小有建树答主
回答量:435
采纳率:78%
帮助的人:210万
展开全部

看了你的问题,才百度学习的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);
一年孤独58aa
2019-06-06 · TA获得超过1404个赞
知道小有建树答主
回答量:592
采纳率:92%
帮助的人:443万
展开全部
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, 在浏览器控制台查看效果.

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
网海1书生
科技发烧友

2019-06-06 · 擅长软件设计、WEB应用开发、小程序
网海1书生
采纳数:12311 获赞数:26228

向TA提问 私信TA
展开全部
function x(abc){
   for (let i = 0, k = 0; i < 4; i++){
      async1(success(){
         async2().then(()=>{
            if ( ++k == 4 ) abc();
         });
      });
   }
}
x(async3);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2019-06-05
展开全部
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是个时间较久的异步函数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式