需求:在开发中需要同时请求多个接口,但是需要请求按顺序执行。比如先拿到接口a的返回值shopid,作为接口b的请求参数再调接口拿到仓库列表。
解决办法: 将接口a封装在promise中,在调用promise前加上await,await会等待promise中执行完resolve时,才会再进行下一步操作。
// 1、获取用户列表,将第一位用户的门店设置为当前门店 getusers() { return new promise((resolve, reject) => { let data = { limit: 999, page: 1, roleids: "1,2", bindstatus: 0, }; getbuyuserlist(data) .then((res) => { this.userlist = res.list; if (!this.form.buyid) { this.form.buyuserid = res.list[0].userid; this.form.shopid = res.list[0].shopid; } // promise封装的接口里面可以没有return,但是一定要调用 resolve 函数,表明异步任务顺利完成且返回结果值 resolve(); }) .catch((error) => { reject(error); }); }); }, ///2、设置仓库的默认项 setdefaultselection() { let data = { page: 1, limit: 10, shopid: this.form.shopid, //只筛选当前门店关联的仓库 }; getwarehouselist(data).then((res) => { this.warehouselist = res.list; if (!this.form.buyid) { this.form.warehouseid = this.warehouselist[0].warehouseid; this.form.warehousename = this.warehouselist[0].name; } }); }, // vue实例被创建后立即调用接口获取筛选项数据 async created() { await this.getusers(); this.setdefaultselection(); }
promise对象
简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
promise 是一个对象,promise 提供统一的 api,各种异步操作都可以用同样的方法进行处理。axios 的内部实现原理就是通过 promise 实现的。
promise对象的两个特点
- 对象的状态不受外界影响。有三种状态:pending(进行中)、fulfilled(成功)和rejected(失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态
- 一旦状态改变,就不会再变,任何时候都可以得到这个结果。promise对象的状态改变,只有两种可能:从pending变为resolved和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果
promise对象是一个构造函数,用来生成promise实例,带有一个回调函数,回调函数的两个参数是 resolve(成功) 和 reject(失败),这两个参数他们也是函数。
链式调用then方法
then方法的第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数,它们都是可选的。
但是规范化的写法是调用then和catch方法。
let p = promise.resolve("foo"); // 等价于 let p = new promise((resolve) => { resolve("foo"); }); p.then((data) => { console.log(data); //输出'foo' }); var p2 = new promise(function (resolve, reject) { var flag = false; if(flag){ resolve('这是数据2'); }else{ reject('这是数据2'); } }); p2.then(function(data){//状态为fulfilled时执行 console.log(data); console.log('这是成功操作'); },function(reason){ //状态为rejected时执行 console.log(reason); console.log('这是失败的操作'); });
总结
到此这篇关于js多次请求接口按顺序依次执行解决办法的文章就介绍到这了,更多相关js多次请求接口按顺序执行内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论