Koa异步处理Async 、Await和Promise 的使用

async 是“异步”的简写,而 await 可以认为是 async wait 的简写。所以应该很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。

简单理解:

async 是让方法变成异步。

在终端里用 node 执行这段代码,你会发现输出了 Promise {‘Hello async’ },这时候会发现它返回的是 Promise。

async function testAsync(){   return ‘Hello async‘;
}
const result = testAsync(); console.log(result);

await 是等待异步方法执行完成。

其实 await 等待的只是一个表达式,这个表达式在官方 文档里说的是 Promise 对象,但是它也可以接受普通值。 注意:await 必须在 async 方法中 才可以使用因为 await 访问本身就会造成程序停止堵塞,所以必须在异步方法中才可以使用。

function getData(){
    return ‘zhangsan‘;
}
async function testAsync(){
    return ‘Hello async‘;
}
async function test(){
const v1=await getData(); const v2=await testAsync(); console.log(v1,v2);
} test();

async/await 同时使用

async 会将其后的函数(函数表达式或 Lambda)的返回值封装成一个 Promise 对象,而 await 会等待这个 Promise 完成,并将其 resolve 的结果返回出来。

function findData() {
return new Promise(resolve => {
  setTimeout(() => resolve("long_time_value"),   1000); });
}
async function test() {
const v = await findData(); console.log(v);
} test();

案例:

/*和var是一样的
   let a=123;
  * */

/*

 是一个块作用域
 if(true){

 let a=123;
 }
 console.log(a);

* */

/*常量
    const PI=3.14159;

    PI=3;

    console.log(PI);
 */

/*模板字符串
    var name=‘张三‘;
    var age=20;
    console.log(name+‘的年龄是‘+age);

 var name=‘张三‘;
 var age=20;
 console.log(`${name}的年龄是${age}`);

 */

/*方法的简写 属性的简写

 var name=‘zhangsan‘;
 var app={
 name:name
 }

 console.log(app.name);

 属性的简写
 var name=‘zhangsan‘;
 var app={
 name
 }

 console.log(app.name);

方法的简写
 var name=‘zhangsan‘;
 var app={
 name,
 run(){

    console.log(`${this.name}在跑步`);
 }
 }

 app.run();

 */

/*
箭头函数   this指向上下文

 setTimeout(function (){

    console.log(‘执行‘);
 },1000)

 setTimeout(()=>{

     console.log(‘执行‘);
 },1000)

* */

/*回调函数 获取异步方法里面的数据
     function getData(callbck){

     //ajax
     setTimeout(function(){
     var name=‘张三‘;
     callbck(name);

     },1000);

     }

     //外部获取异步方法里面的数据

     getData(function(data){
     console.log(data+‘111‘);

     })
* */

/*Promise来处理异步
 resolve 成功的回调韩红素

 reject失败的回调函数

 var p=new Promise(function(resolve,reject){
     //ajax
     setTimeout(function(){
         var name=‘张三‘;

         if(Math.random()<0.7){
         resolve(name);

         }else{
         reject(‘失败‘);
         }

     },1000);
 })

 p.then((data)=>{

 console.log(data);
 })

* */

function getData(resolve,reject){

    //ajax
    setTimeout(function(){
        var name=‘张三‘;
        resolve(name);

    },1000);

}

var p=new Promise(getData);

p.then((data)=>{

    console.log(data);
})
//async 是让方法变成异步

/*
普通方法

 function getData(){
 return ‘这是一个数据‘;
 }
 console.log(getData());  //这是一个数据
* */
/*
async 是让方法变成异步

 async function getData(){
 return ‘这是一个数据‘;
 }

 console.log(getData());  //Promise { ‘这是一个数据‘ }

* */

/*如何获取async 异步方法里面的数据的第一种方法
 async function getData(){

     return ‘这是一个数据‘;
 }

 var p=getData();
 p.then((data)=>{
     console.log(data);
 })

* */

//await 是等待异步方法执行完成,可以获取异步方法里面的数据,但是必须得用在异步方法里面

/*await 错误的用法
 async function getData(){

    return ‘这是一个数据‘;
 }

 var d=await getData();
 console.log(d);  //await is only valid in async function

* */

//await 是等待异步方法执行完成,可以获取异步方法里面的数据,但是必须得用在异步方法里面

/*
 async function getData(){

    return ‘这是一个数据‘;
 }

 async function test(){

    var d=await getData();

    console.log(d);
 }
 test();

* */

//await 阻塞的功能 ,把异步改成一个同步

//async function getData(){
//    console.log(2);
//    return ‘这是一个数据‘;
//}
//async function test(){
//
//    console.log(1);
//    var d=await getData();
//    console.log(d);
//    console.log(3);
//}
//test();  //1  2  3

//async 定义的方法返回的是 Promise对象。

/*
 function getData(){

    return new Promise((resolve,reject)=>{
          setTimeout(()=>{
                 var username=‘张三‘;
                 resolve(username);

          },1000)
     })
 }

 var p=getData();
 p.then(function(d){
        console.log(d);

 })

* */

function getData(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            var username=‘张三‘;
            resolve(username);

        },1000)
    })
}
async function test(){

    var data=await getData();
    console.log(data);
}

test();

原文地址:https://www.cnblogs.com/loaderman/p/11511035.html

时间: 2024-10-11 10:56:54

Koa异步处理Async 、Await和Promise 的使用的相关文章

JavaScript异步编程——Async/Await vs Promise

兼容性 提醒一下各位,Node 现在从版本 7.6 开始就支持 async/await 了.而就在前几天,Node 8已经正式发布了,你可以放心地使用它. 如果你还没有试过它,这里有一堆带有示例的理由来说明为什么你应该马上采用它,并且再也不会回头. Async/await  对于那些从未听说过这个话题的人来说,如下是一个简单的介绍: Async/await 是一种编写异步代码的新方法.之前异步代码的方案是回调和 promise. Async/await 实际上是建立在 promise 的基础上.

js异步回调Async/Await与Promise区别 新学习使用Async/Await

Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面一起来看看这篇文章:Async/Await替代Promise的6个理由. 什么是Async/Await? async/await是写异步代码的新方式,以前的方法有回调函数和Promise. async/await是基于Promise实现的,它不能用于普通的回调函数. async/await与Prom

JavaScript 的 Async\/Await 完胜 Promise 的六

参考:http://www.10tiao.com/html/558/201705/2650964601/1.html Node 现在从版本 7.6 开始就支持 async/await 了. 简介: Async/await 是一种编写异步代码的新方法.之前异步代码的方案是回调和 promise. Async/await 实际上是建立在 promise 的基础上.它不能与普通回调或者 node 回调一起用. Async/await 像 promise 一样,也是非阻塞的. Async/await 让

Async/Await替代Promise的理由

Async/Await简介 对于从未听说过async/await的朋友,下面是简介: async/await是写异步代码的新方式,以前的方法有回调函数和Promise. async/await是基于Promise实现的,它不能用于普通的回调函数. async/await与Promise一样,是非阻塞的. async/await使得异步代码看起来像同步代码,这正是它的魔力所在. Async/Await语法 示例中,getJSON函数返回一个promise,这个promise成功resolve时会返

[转] Async/Await替代Promise的6个理由

Node.js 7.6已经支持async/await了,如果你还没有试过,这篇博客将告诉你为什么要用它. Async/Await简介 对于从未听说过async/await的朋友,下面是简介: async/await是写异步代码的新方式,以前的方法有回调函数和Promise. async/await是基于Promise实现的,它不能用于普通的回调函数. async/await与Promise一样,是非阻塞的. async/await使得异步代码看起来像同步代码,这正是它的魔力所在. Async/A

关于async/await、promise和setTimeout执行顺序

先来一道关于async/await.promise和setTimeout的执行顺序的题目: 1 async function async1() { 2 console.log('async1 start'); 3 await async2(); 4 console.log('asnyc1 end'); 5 } 6 async function async2() { 7 console.log('async2'); 8 } 9 console.log('script start'); 10 set

Async/Await替代Promise的6个理由

译者按: Node.js的异步编程方式有效提高了应用性能:然而回调地狱却让人望而生畏,Promise让我们告别回调函数,写出更优雅的异步代码:在实践过程中,却发现Promise并不完美:技术进步是无止境的,这时,我们有了Async/Await. 原文: 6 Reasons Why JavaScript’s Async/Await Blows Promises Away 译者: Fundebug 为了保证可读性,本文采用意译而非直译. Node.js 7.6已经支持async/await了,如果你

异步编程Async/await关键字

异步编程Async \await 关键字在各编程语言中的发展(出现)纪实. 时间 语言版本 2012.08.15 C#5.0(VS2012) 2015.09.13 Python 3.5 2016.03 ECMAScript 2016 (ES7) C#中的用法和浅层次原理 我是占位代理 Python中的用法,和协程 我是占位代理 Javascript中的说明 我是占位代理,不懂具体用法.

async/await、promise 遍历

for 遍历语句 async function run() { for (let i = 0; i < 2; i++) { for (let j = 0; j < 2; j++) { await new Promise(resolve => { setTimeout(async () => { await new Promise(resolve => { setTimeout(() => { console.log(1) resolve() }, 3000) }) co