Promise和async和await的理解

目录

  • 1.回调函数直接作为函数参数

    • 1.1传统的方式,使用jquery的get方法
    • 语法
    • 1.2 fetch方法
    • 1.3 Promise方法
  • 2.async和await的理解

1.回调函数直接作为函数参数

1.1传统的方式,使用jquery的get方法

语法

$.get(URL,data,function(data,status,xhr),dataType)

该方法里面可以设置回调函数,如下代码,可以在console窗口中直接执行,function(data)就代表get调用/数据请求之后的回调函数

$.get(‘/‘)
//{readyState: 1, getResponseHeader: ?, getAllResponseHeaders: ?, setRequestHeader: ?, overrideMimeType: ?,?…}

$.get(‘/‘,function(data){console.log(data.length)})
//{readyState: 1, getResponseHeader: ?, getAllResponseHeaders: ?, setRequestHeader: ?, overrideMimeType: ?,?…}
//208896

$.get(‘/‘,function(data2){console.log(data2.length)})
//{readyState: 1, getResponseHeader: ?, getAllResponseHeaders: ?, setRequestHeader: ?, overrideMimeType: ?,?…}
//206281

$.get(‘/‘,function(){console.log("a")})
//{readyState: 1, getResponseHeader: ?, getAllResponseHeaders: ?, setRequestHeader: ?, overrideMimeType: ?,?…}
//a

1.2 fetch方法

请注意,fetch 规范与 jQuery.ajax() 主要有三种方式的不同:

  • 当接收到一个代表错误的 HTTP 状态码时,从 fetch() 返回的 Promise 不会被标记为 reject, 即使响应的 HTTP 状态码是 404 或 500。相反,它会将 Promise 状态标记为 resolve (但是会将 resolve 的返回值的 ok 属性设置为 false ),仅当网络故障时或请求被阻止时,才会标记为 reject。
  • fetch() 不会接受跨域 cookies;你也不能使用 fetch() 建立起跨域会话。其他网站的 Set-Cookie 头部字段将会被无视。
  • fetch 不会发送 cookies。除非你使用了credentials初始化选项。(自 2017 年 8 月 25 日以后,默认的 credentials 政策变更为 same-origin。Firefox 也在 61.0b13 版本中进行了修改)
fetch(‘./‘)
//Promise?{<pending>}

$.get(‘/‘,function(data){console.log(data.length)})
//{readyState: 1, getResponseHeader: ?, getAllResponseHeaders: ?, setRequestHeader: ?, overrideMimeType: ?,?…}
//208896

fetch(‘./‘).then(res=>res.text()).then(data=>console.log(data.length))
//Promise?{<pending>}
//206267

1.1 的jquery是将回调函数作为一个参数传递,而fetch里面是利用promise的then方法来调用回调函数。

1.3 Promise方法

setTimeout(console.log(123),1000)
//123

new Promise((resolve,reject)=>{
        setTimeout(function(){resolve(123)},1000)
    }).then(res=>console.log(res))
//Promise?{<pending>}
//间隔1s后,123

new Promise((resolve,reject)=>{
        setTimeout(function(){reject(123)},1000)
    }).then(res=>console.log(res))
//Promise?{<pending>}
//Uncaught (in promise) 123

   new Promise((resolve,reject)=>{
        setTimeout(function(){reject(123)},1000)
    }).then(res=>console.log(res))
    .catch(e=>console.log(e))
//Promise?{<pending>}
//123

new Promise的时候里面内容会立即执行!!因而为了能实现调用时执行,Promise一般都是作为函数的返回值,可以将普通的回调函数作为参数的形式改造成promise的形式,和执行如果setTimeout的效果是一样的。promise返回的是reject,就会抛异常,一般reject的通过catch来捕获异常。

接下来定义一个函数p1,该函数返回Promise对象,执行该函数就会返回一个Promise对象。

var p1=()=>new Promise((resolve,reject)=>{
        setTimeout(function(){resolve(12345)},1000)
    })

p1
//()=>new Promise((resolve,reject)=>{
//        setTimeout(function(){resolve(12345)},1000)
 //   })

p1()
//Promise?{<pending>}

await会拿到resolve结果,是then函数的语法糖,如下代码,async+await是promise+then的语法糖。

async function q1(){
    var res=await p1();
    console.log(res);
}
q1()
//12345

function q1(){
    p1().then(res=>console.log(res));
}
q1()
//12345

思考一下下面的代码,最后会同时打印出12345。

var p1=()=>new Promise((resolve,reject)=>{
        setTimeout(function(){resolve(12345)},1000)
    })

async function q2(){
    var res=await p1();
    console.log(res);
}

async function q1(){
    var res=await p1();
    console.log(res);
}

q1();
q2();
//Promise?{<pending>}
//12345
//12345

2.async和await的理解

async函数(异步函数)

函数的返回值为promise对象

promise对象的结果由aync函数的返回值决定。

await表达式

await操作符用于等待一个Promise对象。他只能在async function中使用

await得到的结果就是Promise成功的value

async function fn() {
    return 1;
}
const result = fn();
console.log(result);

async function fn1() {
    throw 2;
}
const result1 = fn1();
console.log(result1);

代码运行结果为,可以看出async函数的结果值为Promise对象

Promise {: 1}

  1. proto__: Promise
  2. [[PromiseStatus]]*: "resolved"
  3. [[PromiseValue]]*: 1
  4. Promise {: 2}
    1. proto: Promise
    2. [[PromiseStatus]]: "rejected"
    3. [[PromiseValue]]: 2

从代码运行结果可以看出,async函数的返回值是Promise对象,拿到这个对象之后我们就可以调用then函数了,调用这个then的回调函数,

async function fn1() {
    throw 2;
}
const result1 = fn1();
console.log(result1);
result1.then(
    value => {
        console.log("onResolved()", value);
    },
    reason => {
        console.log("onRejected()", reason)
    }
)

代码运行结果为:

Promise?{<rejected>: 2}
index.js:19706 onRejected() 2

async函数的返回其实是这样的

async function fn1() {
     return Promise.resolve(2);
    // return Promise.reject(3);
}

上面的代码可以发现async函数的返回结果是Promise对象,这个Promise对象的结果必须通过调用then函数才能取出来。如果我们不想通过调用then函数来处理得到value值呢?

这里注意一点await在的函数一定要声明为async函数,不然会报错,如下代码,fs()函数如果没有被定义为async函数,则会报错,这样我们直接通过await就拿到了async函数返回的值。

async function fn2() {
    return 1;
}

async function f3() {
    const value=await fn2();
    console.log(value);
}
f3();

如果await右侧表达式不是promise,得到的结果就是它本身。

async function f4() {
    const value=await 11;
    console.log(value);
}
f4();
//11

上面的例子await得到的都是成功的结果,如果想得到失败的结果呢??用try catch来进行,如下代码

async function fn2() {
    return Promise.reject(‘ed‘);
}
async function f4() {
    try {
        const value = await fn2();
    } catch (error) {
        console.log(error);
    }
}

f4();
//ed

原文地址:https://www.cnblogs.com/zdjBlog/p/12588319.html

时间: 2024-10-08 10:39:42

Promise和async和await的理解的相关文章

Promise、async、await在Egret的简单应用

Egret Engnie 5.1.10 Egret Wing 4.1.5 一.Promise.async.await相关知识 Promise介绍 阮一峰 async函数 阮一峰 具体和详细的说明用法可以查看以上资料.说实话,从as3转过来,用这些语法真的不习惯... 二.Egret中promise的用法 Egret中原本使用监听回调的方式加载皮肤主题文件被修改成了promise的用法 原来的RES资源管理类,loadGroup也被替换成了Promise的用法.其他如getResAsync.loa

ES6中的promise、async、await用法详解

<!DOCTYPE html> <html> <head> <title>Promise.async.await</title> </head> <body> <script type="text/javascript"> //promise用法(返回异步方法返回的数据,resolve获取数据成功后调用的方法, reject获取数据失败后调用的方法) //第一种写法 var p = new

Promise,Async,await简介

Promise 对象 转载:http://wiki.jikexueyuan.com/project/es6/promise.html 基本用法 ES6 原生提供了 Promise 对象.所谓 Promise 对象,就是代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API,可供进一步处理. 有了 Promise 对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数.此外,Promise 对象提供的接口,使得控制异步操作更加容易.Promise

对python async与await的理解

async/await关键字是出现在python3.4以后.网上已经有很多文章对async/await这两个关键字都有讲解,包括如何由python2的yield from发展到async/await这两个关键字,以及一些代码实现都有.但是对于像我这样初次接触的人来说,光看代码分析也不一定能理解,我也是在度娘上搜索很多相关的网站,当中也有官网,都没有发现能让我一眼看懂在什么地方可以用await,什么情况用await的文章.经过自己的重新思考,总算对async.await有一些初步的了解,所以想把自

callback、promise和async、await的使用方法

callback 回调是一个函数被作为一个参数传递到另一个函数里,在那个函数执行完后再执行.通俗的讲就是 B函数被作为参数传递到A函数里,在A函数执行完后再执行B. promise Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大,ES6规定,Promise对象是一个构造函数,用来生成Promise实例.Promise实例具有then方法,也就是说,then方法是定义在原型对象Promise.prototype上的. async/await 它就是

异步-promise、async、await

下面代码打印结果是? setTimeout(()=>{ console.log(1) }) new Promise((resolve,reject)=>{ console.log(2) resolve() }) .then(()=>{ console.log(3) }) new Promise((resolve,reject)=>{ console.log(4) resolve() }) .then(()=>{ console.log(5) }) setTimeout(()=

promise、async和await之执行顺序

async function async1(){ console.log('async1 start') await async2() console.log('async1 end') } async function async2(){ console.log('async2') } console.log('script start') setTimeout(function(){ console.log('setTimeout') },0) async1(); new Promise(f

promise、async、await、settimeout异步原理与执行顺序

一道经典的前端笔试题,你能一眼写出他们的执行结果吗? async function async1() { console.log("async1 start"); await async2(); console.log("async1 end"); } async function async2() { console.log( 'async2'); } console.log("script start"); setTimeout(functi

理解异步之美:Promise与async await(一)

你可能会放出一个怪物 异步与同步相比,最难以掌控的就是异步的任务会什么时候完成和完成之后的回调问题, 难以掌控的触发状态,让你自己写的代码当时还可以读懂,但是过几天.半个月之后如果不重新盘一边逻辑,你哪知道哪个内容会先执行,借用这么一个例子 listen( "click", function handler(evt){ setTimeout( function request(){ ajax( "http://some.url.1", function respon