首页 > 其他分享 >promise、async、await

promise、async、await

时间:2023-06-13 10:57:14浏览次数:27  
标签:function resolve await promise Promise async

一、promise

语法上:promise是一个对象,从它可以获取异步操作的消息

本意上:它是承诺,承诺它过一段时间会给你一个结果

【如果想通过异步方法先后检测用户名和密码,需要先异步检测用户名,然后再异步检测密码的情况下就很适合 Promise】

1、创建

此构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调

在回调中执行一些操作(例如异步),如果一切都正常,则调用 resolve,否则调用 reject。

var promise = new Promise(function(resolve, reject) {
    // 异步处理
    // 处理结束后、调用resolve 或 reject
});

2、promise的构造函数

Promise 构造函数返回一个 Promise 对象,该对象具有以下几个方法:

  • then:用于处理 Promise 成功状态的回调函数。
    • 可以将参数中的函数添加到当前 Promise 的正常执行序列
    • 传入的函数会按顺序依次执行,有任何异常都会直接跳到 catch 序列:
    • then 块默认会向下顺序执行,return 是不能中断的,可以通过 【throw】 来跳转至 catch 实现中断
  • catch:用于处理 Promise 失败状态的回调函数。
    • 设定 Promise 的异常处理序列
  • finally:无论 Promise 是成功还是失败,都会执行的回调函数。
  • 是在 Promise 执行的最后一定会执行的序列
//不同时间间隔输出三行文本
function print(delay, message) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            console.log(message);
            resolve();
        }, delay);
    });
}

print(1000, "First").then(function () {
    return print(4000, "Second");
}).then(function () {
    print(3000, "Third");
});

3、Promise三种状态

  pending(等待态)    |     fulfiled(成功态)    |     rejected(失败态)

  状态一旦改变,就不会再变。创造promise实例后,它会立即执行

二、async await

【基于promise实现,也是非阻塞的异步转同步】

  • 里面的await只能在async函数中使用,await 指令后必须跟着一个 Promise
  • async 内部实现,又返回值 成功返回promise.resolve() ,出错返回promise.reject() 返回值用catch捕获
  • await语句后的Promise对象变成reject状态时,那么整个async函数会中断,后面的程序不会继续执行
  • async函数返回的是一个Promsie对象
//不同时间间隔,输出三行文本
function print(delay, message) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            console.log(message);
            resolve();
        }, delay);
    });
}

async function asyncFunc() {
    await print(1000, "First");
    await print(4000, "Second");
    await print(3000, "Third");
} asyncFunc();

3、处理异常的机制将用【 try-catch 】块实现

async function asyncFunc() {
    try {
        await new Promise(function (resolve, reject) {
            throw "Some error"; // 或者 reject("Some error")
        });
    } catch (err) {
        console.log(err);
        // 会输出 Some error
    }
}
asyncFunc();

 三、promise|async|await的区别

promise es6语法,promise中包含catch,async需要自己定义catch

promise 提供的方法会多一些,all、race等方法,aync中是没有的

 

 

 

 

 

标签:function,resolve,await,promise,Promise,async
From: https://www.cnblogs.com/le-fang/p/17476872.html

相关文章

  • [Javascript] async / defer
     normalscript,withoutasyncdefer:Scriptfetchedandexecutedimmediately,beforebrowsercontinuesparsingthepage(ItstopsHTMLparsing).Ifthescriptislarge,thiscancausenoticeabledelaysinpageloading. async:Scriptisfetchedasynchr......
  • vue3的composition API如何使用async语句
    问题:在setup使用aysnc,生命函数钩子和函数必须出现在await语句前面,否者会出现组件无法渲染以及内存泄漏的问题。import{ref,watch,onMounted,onUnmounted}from'vue'exportdefaultdefineAsyncComponent({asyncsetup(){constcounter=ref(0......
  • Promise解决并发请求和async/await解决并发请求
    有的时候会出现一种情况,就是你需要调用多次API,因为可能调一次返回的数据量过大,占满了带宽就直接卡死,但是你又不想每次只调用一个,想每次调用多个,你就可以尝试下面的方法:使用Promise解决并发问题functionasyncconcurrentRequests(args,len=10){constrecordArr=0//......
  • 【C#/.NET】Dapper使用QueryMultipleAsync执行多条SQL
    ​ 目录 背景解决方案总结 背景        对于查询数据列表的功能,需要分页已经查询总数。这里涉及两句SQL,一个是查询分页对应的数据,第二个是Count(*);会导致部分重复代码和两次的数据库查询。 解决方案        Dapper有封装QueryMultipleAsync的......
  • promise.all简易实现
    functionall(arr){returnnewPromise((resolve,reject)=>{letrtnArr=[]letcount=0for(leti=0;i<arr.length;i++){Promise.resolve(arr[i]).then(res=>{rtnArr[i]=rescount+=1count......
  • 详解C#中 Thread,Task,Async/Await,IAsyncResult的那些事儿
    说起异步,Thread,Task,async/await,IAsyncResult这些东西肯定是绕不开的,今天就来依次聊聊他们1.线程(Thread)多线程的意义在于一个应用程序中,有多个执行部分可以同时执行;对于比较耗时的操作(例如io,数据库操作),或者等待响应(如WCF通信)的操作,可以单独开启后台线程来执行,这样主线程就不会......
  • 异步编程async体会
    namespace异步编程{classProgram{staticvoidMain(string[]args){Console.WriteLine("mianthisisasync{0}",Thread.CurrentThread.ManagedThreadId);Do();......
  • Async异步注解
    @RestController@Slf4jpublicclassThread04{@AutowiredprivateOrderManageorderManage;@GetMapping("addOrder")publicStringaddOrder(){log.info("1");//异步处理orderManage.asyncLog();......
  • Python asyncio之协程学习总结
    实践环境Python3.6.2什么是协程协程(Coroutine)一种电脑程序组件,该程序组件通过允许暂停和恢复任务,为非抢占式多任务生成子程序。协程也可以简单理解为协作的程序,通过协同多任务处理实现并发的函数的变种(一种可以支持中断的函数)。下面,我们通过日常生活场景为例,对什么是协程进行说......
  • Vue进阶(幺零八):npm run build 错误 (node:7852) UnhandledPromiseRejectionWarning: Cs
    (文章目录)一、前言在项目打包过程中,突然报如下错误:Vuenpmrunbuild错误(node:7852)UnhandledPromiseRejectionWarning:CssSyntaxError:xxxx.但是在执行npmrundev过程中,并未错误或告警信息。二、解决方案打开webpack.prod.conf.js,注释掉以下配置代码newOptimiz......