多个等待状态的javascript异步

时间:2018-11-22 08:44:31

标签: javascript asynchronous vue.js

我有三个api请求可以异步工作,但是第二个请求在第一个请求完成之前就可以工作了。如何使第二个api请求在完成第一个请求之后开始,然后在第二个请求之后第三个请求开始?

async doSave(event)
{
  await this.server.post('/insertRecord',{name:'joe'});

            //have to work after completion of above request

  await this.server.post('/changeCountry',{countryName:'US'});

          //have to work after completion of above request

  await this.server.post('/satge',{stage:'fifth'});
}

3 个答案:

答案 0 :(得分:3)

如果第二个请求在第一个请求之前开始,则意味着this.server.post返回的Promise在请求完成之前已解决。或者,它根本不返回Promise,在这种情况下,它将启动您的异步请求,然后在this.server.post返回之后在此函数中运行下一行。

答案 1 :(得分:1)

服务器应返回一个承诺,在这种情况下,await将等待其解决。在下面的代码中,我模拟了服务器以测试整个代码。它将同步进行工作。

const server = {
  post: function(url, data) {
    const time = 300 + Math.random() * 1500;
    console.log("Posting at " + url + " ... (" + Math.round(time) + "ms)");
    return new Promise(resolve => setTimeout(() => resolve(), time)
    );
  }
};

async function doSave(event) {
  await server.post('/insertRecord', {
    name: 'joe'
  });

  //have to work after completion of above request
  console.log('doing Work after InsertRecord');
  await server.post('/changeCountry', {
    countryName: 'US'
  });

  //have to work after completion of above request
  console.log('doing Work after changeCountry');
  await server.post('/satge', {
    stage: 'fifth'
  });
}
doSave();

输出:

Posting at /insertRecord ... (1306ms)
doing Work after InsertRecord
Posting at /changeCountry ... (1752ms)
doing Work after changeCountry
Posting at /satge ... (1616ms)

选中this link for more information about await, async, promises

答案 2 :(得分:0)

理想情况下,this.server-应该返回promises(例如,axios返回承诺),但如果不这样,则可以使用Promises代替Async/await并链接您的请求相继。