精华内容
下载资源
问答
  • WinRT:超越async与await

    千次阅读 2012-05-21 23:44:25
    本文来源于我在InfoQ中文站翻译文章,原文地址是:http://www.infoq.com/cn/news/2012/05/await_async新WindowsRuntime(WinRT)目标之一就是为开发者进行异步编程提供更好支持。借助于异步操作,程序可以在...
    本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2012/05/await_async

    新的WindowsRuntime(WinRT)的目标之一就是为开发者进行异步编程提供更好的支持。借助于异步操作,程序可以在其他操作(诸如文件I/O或是网络通信)尚未结束的情况下保持对用户的响应。这种响应性对于大多数用户应用来说都是很有用的,包括触摸界面,用户在这种情况下希望手势能有快速的反馈。

    为了实现这个目的,C#与Visual Basic程序员通过“await/async”关键字来实现异步操作,同时又不会造成程序控制流的过分复杂。遵循async API调用的程序可以依靠编译器在发出调用时自动将上下文切换至原来的状态。近日,来自微软的Stephen Toub详细解释了该过程的工作原理。

    编译器内部重写了标记为async的方法以通过状态机将其实现出来。当程序员将某条语句标记为“await”,编译器就可以插入标记,通过这些标记,编译器能够知晓可以在何处挂起与继续方法的执行,在这个过程中是不需要用到锁的。

    Toub说到:

    在等待某个尚未完成的异步操作时,编译器生成的代码能够确保与该方法相关的所有状态(比如说局部变量等)都会被打包并保存到堆上。接下来,函数返回到调用者,这样其运行的线程就可以做其他事情了。当稍后等待的异步操作完成时,方法的执行又会使用之前保存的状态继续下去。

    Toub又继续介绍了一些场景,程序员会看到比“await”所提供的更为强大的控制。在这种情况下就需要通过“AsTask”方法来为进度报告提供支持或是支持多点继续。

    查看英文原文:Going Beyond async and await On WinRT

    展开全文
  • 最近朋友问起await 和async第一次听说这个await ,就查了一下这个await使用在于 异步方法async 中,中文意思就是等待,经过一系列百度参考简单明白了这个东西意思, 异步方法执行时,等待await 标识语句(存储...

        最近朋友问起await  和 async第一次听说这个await ,就查了一下这个await使用在于 异步方法async 中,中文意思就是等待,经过一系列的百度参考简单的明白了这个东西的意思,  异步方法执行时,等待await 标识语句(存储结果或运算结果)完成,再执行异步方法中后续语句,await用来让异步方法等待一个结果的产生(http://www.cnblogs.com/liqingwen/p/5922573.html#link6) 看这段理解不太明白,别心急,看下面代码结合运行结果

    代码示例:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Net.Http;
     5 using System.Text;
     6 using System.Threading;
     7 using System.Threading.Tasks;
     8 
     9 namespace 异步调用
    10 {
    11     class Program
    12     {
    13 
    14         static void Main(string[] args)
    15         {
    16 
    17             Console.WriteLine("非异步操作");
    18 
    19             var result = ansyPrint("异步操作");
    20 
    21             Console.WriteLine("非异步操作继续执行...");
    22             Console.WriteLine("非异步操作执行结束...");
    23             Console.ReadKey(true);
    24 
    25         }
    26 
    27         public static async Task<int> ansyPrint(string s)
    28         {
    29             //记得 using System.Net.Http 哦
    30             var client = new HttpClient();
    31             Console.WriteLine("异步方法开始执行:" + s);
    32             //执行异步方法 GetStringAsync
    33             Task<string> getStringTask = client.GetStringAsync("http://www.baidu.com/");
    34 
    35             //假设在这里执行一些非异步的操作
    36             Console.WriteLine("1");
    37             Console.WriteLine("2");
    38             //插在 费异步操作其中
    39             string urlContents = await getStringTask;
    40             Console.WriteLine("3");
    41 
    42             Console.WriteLine("异步方法执行结束:" + s);
    43             //返回字符串的长度(int 类型)
    44             return urlContents.Length;
    45         }
    46     }
    47 }

    运行结果:

    总结:

      通过运行结果可以看出   当执行到 await getStringTask;时 ,就跳回 主线程执行操作,挂起异步方法中 下载网页操作,但不影响主线程的操作。

      然后简单说明一下    异步方法 其中的正常运算(加减乘除或调用其他方法)不是异步操作,而是当碰到await时 之后的操作才能算是 真正的异步操作,毕竟是遇到await时才回跳到异步方法之后,由此可以看出 异步操作其实就是一个回调方法。

    /// 异步方法声明的 3 要素:
            ///     ① async 修饰符
           ///     ② 返回类型 Task 或 Task<TResult>:这里的 Task<int> 表示 return 语句返回 int 类型
            ///     ③ 方法名以 Async 结尾
            public static async Task<int> ansyPrint(string s)
            {
                //await 用在 异步方法中
                //await 等待 异步方法结果也就是Task<TResult>类型
            return result; 
         }

     联想的一些内容:

      然后看到这里的时候,我就去问我的那个朋友 (他是搞前端的)这样主线程跟异步操作之间是啥关系,我就跟他阐述一遍我上面自己得到的结论,然后我在自己的文字中发现了一个问题这个  异步操作而不是异步线程,那这两个是有啥区别呢,抱着闲来无事求证的想法,从字面来讲这两个东西确实比较相似,但追求其原理还是有一定的区别,在看了(http://www.cnblogs.com/dream844/archive/2012/06/12/2546083.html)之后有了一定的理解,我只简单说一下我的理解,详细还是看↑这个大佬的。

      异步操作:

      硬件在和内存进行数据交换的时候可以不消耗CPU资源。只要CPU在发起数据传输时发送一个指令,硬件就开 始自己和内存交换数据,在传输完成之后硬件会触发一个中断来通知操作完成。这些无须消耗CPU时间的I/O操作正是异步操作的硬件基础。我个人认为偏向于 数据存储交换

      多线程:

        线程是CPU的概念,是操作系统的一种功能,也就是 操作系统对CPU的使用方法,我个人认为 偏向于逻辑运算

      总结:

      可是总起来说这样理解很是浅,但也能指出大概想法, 不过异步并不是减少对线程的使用,可以上面的例子 想象一下 在主线程只是的时候,异步也在进行操作,其实也就是开了一条子线程,当异步操作完毕,又回到主线程,只是占用的时间相对来说减少一些。 我大概设想,但真正是不是异步操作执行完毕又回到主线程几率不大(其实是系统随机,便于理解),不过最后只是占用了一条线程而不是多条。

    转载于:https://www.cnblogs.com/nnqwbc/p/7404784.html

    展开全文
  • Promise.all + async await

    2021-01-13 12:08:17
    先拿到B的返回值数组,之后拿到A的返回值code,再去B里过滤,最后拿到相应code相对应的中文,这个是async await解决的。 但发送B请求的时候,可能存在循环多次请求的问题,这时候就需要Promise.all,等所有返回都...

    遇到了一个需求
    需要发送两组请求A和B。
    先拿到B的返回值数组,之后拿到A的返回值code,再去B里过滤,最后拿到相应code相对应的中文,这个是async await解决的。
    但发送B请求的时候,可能存在循环多次请求的问题,这时候就需要Promise.all,等所有返回都回来再做下一步。

         async getArr() {
          let promiseArr = [];
            this.categoryDirCodeParams.forEach((item) => {
              this.dirCodeParams.dictDirCode = item;
              promiseArr.push(
                getCodeApi(
                  JSON.stringify({ ...this.dirCodeParams })
                )
              );
            });
          let arr = [];
          await Promise.all(promiseArr).then((resArr) => {
            this.arr = resArr;
            this.arr.forEach((item) => {
              this.saveDirList.push(...item.data);
            });
          });
          getArrApi({
            ...this.resParams
          }).then((res) => {
            if (res.status === 1) {
              this.resChooseSaveData(res);
            }
          });
        },
    
    
    
    展开全文
  • async(/əˈsɪŋk/),await的概念 async和await是用来处理异步的。当你需要异步像同步一样执行,需要异步返回结果之后,再往下依据结果继续执行。 async 是“异步”的简写,而 await 可以认为是 async wait 的简写。...

    保持对代码的热爱并保持怀疑态度

    async("/əˈsɪŋk/"),await的概念

    async和await是用来处理异步的。当你需要异步像同步一样执行,需要异步返回结果之后,再往下依据结果继续执行。
    async 是“异步”的简写,而 await 可以认为是 async wait 的简写。
    async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。

    async的写法(a沈克)此乃中文歪读

    直接声明,表示这个函数是异步的。

    async function 函数名(){
    }
    

    然后里面可以直接执行代码,但是这不是重点,重点是它的返回值

    async的返回值

        async function look(){
            // console.log(1);
        }
        
        const a=look();
        console.log(a);
    

    当没有返回值的时候,为underfined
    在这里插入图片描述

    当有返回值是一个Promise对象

        async function look(){
            return "asd";
    
        }
    
        const a=look();
        console.log(a);
    

    在这里插入图片描述
    既然返回的是一个promise对象
    那是不是就可以使用pormise的then,和catch来处理了呢?没错就是这样
    点击查看promise的语法及使用

    成功后执行,then()

        async function look(){
            return "asd";
    
        }
    
    
        look().then(a=>{
            console.log(a);
        })
    

    在这里插入图片描述

    失败后执行 catch()

        async function look(){
            return "asd";
    
        }
    
    
        look().then(a=>{
            console.log(ab);   故意写错
        }).catch((a)=>{
            console.log(a);
        })
    

    在这里插入图片描述

    await

    await只能放在async函数内部使用,不然是会报错的
    在这里插入图片描述
    await 用于一个异步操作之前,表示要“等待”这个异步操作的返回值。

    await 也可以用于一个同步的值。

    如果它等到的不是一个 Promise 对象,那 await 表达式的运算结果就是它等到的东西。

    如果它等到的是一个 Promise 对象,await 就会阻塞后面的代码,等着 Promise 对象 resolve,然后得到 resolve 的值,作为 await 表达式的运算结果。

    同步代码

    const a = await '123'
    // 相当于
    const a = await Promise.resolve('hello world');
    // 所以直接写同步代码即可,不需要await关键字
    const a = '123';
    

    异步代码

    function fn(num) {      //返回的是一个promise
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(100-num)
            }, 2000);
        })
    }
    
    async function testResult () {   //表示异步
    如果它等到的是一个 Promise 对象,await 就会阻塞后面的代码,**等着 Promise 对象 resolve**,然后得到 resolve 的值,作为 await 表达式的运算结果。
        let result = await fn(10);
        console.log(result);
    }
    
    testResult();
    // 2s 之后,返回90 
    

    案例

    // 2s 之后返回双倍的值
    function doubleAfter2seconds(num) {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(2 * num)
            }, 2000);
        })
    }
    
    async function testResult () {
        console.log('内部调用前') // 2
        let result = await doubleAfter2seconds(30);
        console.log(result); // 4
        console.log('内部调用后') // 5
    }
    
    console.log('外部调用前') // 1
    testResult();
    console.log('外部调用后') // 3
    

    在这里插入图片描述

    分析:
    分析一下上面的执行顺序:
    1、首先打印输出外部调用前,同步代码,顺序执行。
    2、然后调用方法testResult(),打印输出内部调用前,同步代码,顺序执行。
    3、再执行异步方法doubleAfter2seconds,
     1>如果没用await关键字,此后的执行顺序应该是
      内部调用后,外部调用后,2s 之后输出60
      因为异步方法不阻塞其他代码的执行,最后再输出60
     2>这里使用了await关键字,所以到这里后会等待异步返回结果,再往下执行。
    4、当testResult函数内部await阻塞执行后,不会影响到testResult函数外面

    async 函数调用不会造成阻塞,它内部所有的阻塞都被封装在一个 Promise 对象中异步执行。

    所以,在调用testResult函数后,会继续向下执行,打印输出外部调用后
    5、当2s之后,异步函数doubleAfter2seconds执行完成,返回结果,
    打印输出60
    6、因为await将异步变成同步,所以在输出60后,同步执行,再输出内部调用后

    错误处理

    方式一 统一处理

    // 2s 之后返回双倍的值
    function doubleAfter2seconds(num) {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(2 * num)
            }, 2000);
        })
    }
    
    async function testResult () {
        let first = await doubleAfter2seconds(10);
        let second = await doubleAfter2seconds(20);    
        let res = first + second;
        return res;   返回出去
    }
    
    testResult().then(res => {
        console.log(res);      
    }).catch(error => {
        console.log(error);     
    });
    

    方式二 try…catch

    try里面为正常执行,catch里为错误执行

    // 2s 之后返回双倍的值
    function doubleAfter2seconds(num) {
       return new Promise((resolve, reject) => {
           setTimeout(() => {
               resolve(2 * num)
           }, 2000);
       })
    }
    
    async function testResult () {
       try {
           let first = await doubleAfter2seconds(10);
           let second = await doubleAfter2seconds(20);    
           let res = first + second;
           return res;
       } catch (error) {
           console.log(error);
       }
    }
    testResult()
    

    在接口中使用(axios)

    created () {
        this.init()
    },
    methods: {
        async init () {
          try {
              let first = await this.getOne();
              let second = await this.getTwo();    
              let res = first + second;
              console.log(res);
          } catch (error) {
              console.log(error);
          }        
        },
        getOne () {
            const params = {name: 'one'}
            return new Promise((resolve, reject) => {
                axios.get('/one', { params}).then((res) => {
                    if (res.status === 200) {
                        resolve(res)
                    }
                }).catch((err) => {
                    reject(err)
                })
            })
        },
        getTwo () {
            const params = {name: 'two'}
            return new Promise((resolve, reject) => {
                axios.get('/two', { params}).then((res) => {
                    if (res.status === 200) {
                        resolve(res)
                    }
                }).catch((err) => {
                    reject(err)
                })
            })
        },
    },
    
    展开全文
  • 关于 async 和 await 介绍 https://javascript.info/async-await (英文版) https://segmentfault.com/a/1190000013292562?utm_source=channel-newest (中文翻译版) 在了解了 async 和 await 之后,我们就可.....
  • 使用 Async 和 Await 异步编程 以上这篇文章是微软,讲很详细,还包括了大量实验和实例代码,比如 演练:使用 Async 和 Await 访问 Web 如何:使用 Task.WhenAll 扩展异步演练 如何:使用 Async 和 ...
  • async 和 await小结

    2017-01-07 14:17:00
    你可以先回顾一下之前异步操作方式(来自我们stackoverflow总结):中文翻译:https://codeday.me/bug/20170709/39452.html https://stackoverflow.com/questions/1047662/what-is-asynccallback 总来说,第...
  • 原文链接: medium.com/@benlesh/rx…本文为 RxJS 中文社区 ...不时地会有人问我关于如何与 RxJS 配合使用 async 函数或 promises,还有更糟,我被告之“事实”真相是 async-await 和 Observables 并不能“在...
  • 本文最初发布于Patrick Triest个人技术博客,经原作者授权由InfoQ中文站翻译并分享。\\我是如何放弃编写回调函数并爱上JavaScript ES8\\现代JavaScript项目有时候会面临失控危险。其中有个主要原因就是...
  • 昨天有朋友在公众号发消息说看不懂await,async执行流,其实看不懂太正常了,因为你没经过社会毒打,没吃过牢饭就不知道自由有多重要,没生过病就不知道健康有多重要,没用过ContinueWith就不知道await,async有多...
  • 这是一篇学习笔记 各种融合杂谈 ...中文教程 安装Eslint npm i eslint@latest g 配置文件 .eslintrc.json eslint --init eslint test.js 1:5 error 'username' is assigned a value but never used no...
  • 在学异步,有位园友推荐了《async in C#5.0》,没找到中文版,恰巧也想提高下英文,用我拙劣英文翻译一些重要部分,纯属娱乐,简单分享,保持学习,谨记谦虚。 如果你觉得这件事儿没意义翻译又差,尽情踩吧...
  • 字型 Typefont是一个实验库,用于检测图像中文本字体。 用法 导入主函数并像下面脚本一样调用它。 import { Typefont } from "./src/index.js" ; Typefont ( "image.png" ) .... const fonts = await Typefon
  • 获取Dat存档中文本文件逐行差异。 基本上是薄包装器。 const { diffLines } = require ( 'dat-archive-file-diff' ) var a = new DatArchive ( '...' ) var b = new DatArchive ( '...' ) var diff = await ...
  • Sanic 中文文档 拉取了 Sanic 官方文档,翻译成了中文文档,仅供参考。 官方介绍 Sanic 是一款类似 Flask Python 3.5+ ...这意味着你可以使用 Pyhton 3.5 中耀眼新语法 asyncio/await,使你代码不阻塞并且更快。
  • Js中文网周刊第3期

    2020-01-27 15:29:00
    几个神奇Web Api,你(可能)不知道~,面试官问:你能否模拟实现JSbind方法?带你实现自己视频弹幕哦~v8是怎么实现更快 await ?深入理解 await 运行机制……
  • Sequelize数据库中文排序

    万次阅读 2020-10-22 09:36:34
    const datas = await this.ctx.model.Folder.findAll({ where: { pid: 81 }, order: [[ sequelize.literal(‘convert(name using gbk)’), ‘DESC’ ]] }); 按照name字段来进行排序,DESC表示逆序 const sequelize =...
  • 1、执行了一段很简单查询语句,而且连接本地数据库查询中文是正常显示,连线上 linux数据库 中文字段时,就出现问号了。 2、检查了本地数据库和线上数据库数据集,没问题啊,都是utf8 , 3、egg资料确实...
  • es6中文手册

    万次阅读 2016-09-28 12:07:28
    这是一个 ES2015(ES6) Cheatsheet,其中包括提示、小技巧、最佳实践和一些代码片段,帮助你 完成日复一日开发工作。Table of Contents var 与 let / const 声明 代码执行块替换立即执行函数 ...Async Await mor
  • typora-copy-images-to: ipic [TOC] 快速开始 在安装Sanic之前,让我们一起来看看...首先是Python3.4版本引入了asyncio,这让Python有了支持异步IO标准库,而后3.5版本又提供了两个新关键字async/await,目的是...
  • 深入理解C#(第3版)是C#领域不可多得经典著作。本书是世界顶级技术专家“十年磨一剑”经典之作,在C#和.NET领域享有盛誉。作者在详尽地展示C#各个...第15章使用async/await进行异步编程 第16章C# 5附加特性和结束语
  • flutter解决下载html中文乱码问题

    千次阅读 2018-06-13 08:23:55
    目前flutter版本貌似官方不支持gb2312、gbk等gb系列字符集解析,这里要吐槽下!...http.Response response = await http.get(url); String result = response.body; 这里response.body直接返回了...
  • 在本课程中,讲师Alex Banks演示了如何使用异步模式(如回调,promises和async / await)来管理进程并强制执行顺序,并行和并发执行 然后,他回顾了流,这是从Node应用程序读取和写入数据关键功能 他介绍了四种...
  • async/await Pinning Streams 迭代与并发 一次执行多个 Futures join! select! TODO: Spawning TODO:取消和超时 TODO:FuturesUnordered 走走看看,想想 返回类型错误 ?在async代码块 Send估计 ...
  • const res = await this.$http.post('php/tj.php', { t1: this.form.domains }) console.log(res) console.log(this.form.domains) } else { console.log('提交失败!') return false } }) } `...
  • (如果你还不熟悉话,)通过这样方式,这些异步流程看(有点像async / await ,但Generator还有一些更棒而且我们也需要功能)。 你可能已经用了redux-thunk来处理数据读取。不同于终极版thunk,你不会...
  • 3.2 Consuming Asynchronous Streams 使用异步流 Problem问题 You need to process the results of an asynchronous stream, also known as ...Consuming an asynchronous operation is done via await, and consuming

空空如也

空空如也

1 2 3 4 5
收藏数 100
精华内容 40
关键字:

await的中文