Vue 中 Promise 的then方法异步使用及async/await 异步使用总结

vue,promise,then,方法,异步,使用,async,await,总结 · 浏览次数 : 3731

小编点评

**转载** 1. Promise 的 then 方法使用 then 方法是 Promise 中处理的是异步调用,异步调用是非阻塞式的,在调用的时候并不知道它什么时候结束,也就不会等到他返回一个有效数据之后再进行下一步处理;  想了解 Promise 的使用,可以看这篇文章:  ES6 中 Promise对象使用学习  使用示例:new Promise(function (resolve, reject) { resolve(1);}).then(console.log); console.log(2)// 2/ 1 2. 由于then的回调函数属于异步任务,一定晚于同步任务执行。 3. Promise 的回调函数不是正常的异步任务,而是微任务(microtask)。它们的区别在于,正常任务追加到下一轮事件循环,微任务追加到本轮事件循环。这意味着,微任务的执行时间一定早于正常任务。

正文

转载请注明出处:

1.Promise 的 then 方法使用  

  then 方法是 Promise 中 处理的是异步调用,异步调用是非阻塞式的,在调用的时候并不知道它什么时候结束,也就不会等到他返回一个有效数据之后再进行下一步处理;

  想了解 Promise 的使用,可以看这篇文章: ES6 中 Promise对象使用学习 

  使用示例:

new Promise(function (resolve, reject) {
  resolve(1);
}).then(console.log);
 
console.log(2);
// 2
// 1

  Promise 的回调函数属于异步任务,会在同步任务之后执行。上面代码会先输出2,再输出1。因为console.log(2)是同步任务,而then的回调函数属于异步任务,一定晚于同步任务执行。  

  但是,Promise 的回调函数不是正常的异步任务,而是微任务(microtask)。它们的区别在于,正常任务追加到下一轮事件循环,微任务追加到本轮事件循环。这意味着,微任务的执行时间一定早于正常任务。

setTimeout(function() {
  console.log(1);
}, 0);

new Promise(function (resolve, reject) {
  resolve(2);
}).then(console.log);

console.log(3);
// 3
// 2
// 1

  上面代码的输出结果是321。这说明then的回调函数的执行时间,早于setTimeout(fn, 0)。因为then是本轮事件循环执行,setTimeout(fn, 0)在下一轮事件循环开始时执行。

  所以在 使用Promise 的then方法时,一定要考虑 业务的处理逻辑,是否需要串行执行,如果需要串行执行,就要避免 后续的任务 早于 异步的任务执行结束

2. async await 使用

  使用 async 与 await 可以解决多个异步任务执行时的串行执行,也可以解决 Promise 使用 then 方法 异步执行的流程控制

  可以使用 async 和 await来得到我们的返回值

    • async关键词用于函数上(async函数的返回值是Promise实例对象)

    • await关键子用于async函数当中(await可以得到异步的结果)

  Promise构造函数的参数是一个函数,函数里面的代码是异步的,即Promise里面的操作,和Promise()外面的操作时异步"同时"进行的。此外,只要在函数前面加上async 关键字,也可以指明函数是异步的。

  async关键字实际是通过Promise实现,如果async 函数中有返回一个值 ,当调用该函数时,内部会调用Promise.solve() 方法把它转化成一个promise 对象作为返回,但如果timeout 函数内部抛出错误,那么就会调用Promise.reject() 返回一个promise 对象。若某函数调用一个异步函数(比如内部含有primise),该函数应用async修饰。

  await表示“等待”,修饰返回promise 对象的表达式。注意await 关键字只能放到async 函数里面。

//写一个async 函数,从而可以使用await 关键字, await 后面放置的就是返回promise对象的一个表达式    
        async getUserList(){
            const {data: res} = await this.$http.get('users', {
                params: this.queryInfo
            })
            //console.log(res)
            if (res.meta.status !== 200) return this.$message.error('获取用户列表失败! ')
            this.userlist = res.data.users
            this.total = res.data.total
        }

3. async/await处理多个异步请求

  • 第一个异步请求的结果

  • 可以作为第二个异步请求内部的参数,进行判断等数据操作。

  • 形成链式关系

  示例:

function getSomething() {
    return "something";
}
  
async function testAsync() {
    return Promise.resolve("hello async");
}
  
async function test() {
    const v1 = await getSomething();
    const v2 = await testAsync();
    console.log(v1, v2);
}
  
test();

  执行的结果如图所示:

 

   这种写法可以保证的执行顺序;

  

 

与Vue 中 Promise 的then方法异步使用及async/await 异步使用总结相似的内容:

Vue 中 Promise 的then方法异步使用及async/await 异步使用总结

转载请注明出处: 1.Promise 的 then 方法使用 then 方法是 Promise 中 处理的是异步调用,异步调用是非阻塞式的,在调用的时候并不知道它什么时候结束,也就不会等到他返回一个有效数据之后再进行下一步处理; 想了解 Promise 的使用,可以看这篇文章: ES6 中 Prom

VUE中watch的详细使用教程

1、watch是什么? watch:是vue中常用的侦听器(监听器),用来监听数据的变化 2、watch的使用方式如下 watch: { 这里写你在data中定义的变量名或别处方法名: { handler(数据改变后新的值, 数据改变之前旧的值) { 这里写你拿到变化值后的逻辑 } } } 3、wa

vue 中安装并使用echart

本文为博主原创,转载请注明出处: 1.安装echart 依赖: 安装命令: npm install echarts --save 在vscode 的终端窗口进行执行,如图所示: 执行完之后,查看 项目中的echart 版本依赖是否添加成功: package-lock.json 中有具体的echart

在 Vue 中控制表单输入

Vue中v-model的思路很简单。定义一个可响应式的text(通常是一个ref),然后用v-model="text"将这个值绑定到一个input上。这就创造了一个双向的数据流: 用户在输入框中输入,text会发生变化。 text发生变化,输入框的值也随之变化。 让我们看看如何在Vue 3中使用v-

vue中key使用的问题

前言 在vue要求在遍历的时候最好加上key,在使用过程中总有些疑问,在这里做下分析 1.不使用key的时候vue是怎么处理的 在vue2.x文档中有如下描述 key 的特殊 attribute 主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes。如果不使用 key

Vue 中为什么要有nextTick?

摘要:本文将浅析nextTick的作用、使用场景和背后的原理实现,希望对大家有所帮助。 本文分享自华为云社区《Vue 中的 nextTick 有什么作用?》,作者:CoderBin。 一、什么是nextTick 先看看官方对其的定义: 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即

vue中新的状态管理器-pinia

背景 对于pinia的使用,可参考官方文档在这不做过多赘述。这边主要来讲讲pinia中 少用且好用的方法,为什么我们选择pinia而不用vuex ps: 以下写法全部基于组合式API 使用方式: 先下载依赖 npm i pinia -s 在vue3中,main.js这么写 import { crea

关于vue中image控件,onload事件里,event.target 为null的奇怪问题探讨

废话不多说(主要文笔比较差),直接上代码 一个简单的demo,如下 vue代码 imgLoaded(e) { deb

在Vue中使用Canvas绘制背景

好家伙, 在vue中使用canvas绘制与在html中使用canvas绘制大致相同, 但又有所区别 法一(无图片资源): vue中canvas的使用 - 掘金 (juejin.cn) 找到cancas元素; 创建context对象;getContext() 方法返回一个用于画布上绘图环境;参数 ‘2

Vue学习笔记(十):全局事件总线

之前博客中介绍了prop和调用事件的方式在父-子组件之间进行数据,这种方式在只有一层嵌套层时可以使用,但是路过存在多层嵌套,多层多个“兄弟”组件之间传递数据,就非常麻烦。对此,vue中提供了一种全局事件总线机制,数据传递是通过一个空的Vue实例作为中央事件总线,通过它来触发事件和监听事件,可以实现几...