图解 Await 和 Async
文章目录
- 简介
- Promise
- 问题:组合 Promise
- Async 函数
- Await
- 错误处理
- 讨论
简介
Promises
var rp = require('request-promise');
const promise = rp('http://example.com/')
console.log('Starting Execution');
const promise = rp('http://example.com/'); // Line 3
promise.then(result => console.log(result)); // Line 4
console.log("Can't know if promise has finished yet...");

promise 的计算过程。呼叫“线程”不能等待 promise 。在 promise 之后调度代码的唯一方法是通过then方法指定回调函数。
rp('http://example.com/').
then(() => console.log('Success')).
catch(e => console.log(`Failed: ${e}`))
const success = Promise.resolve('Resolved');
// 将会显示 "Successful result: Resolved"
success.
then(result => console.log(`Successful result: ${result}`)).
catch(e => console.log(`Failed with: ${e}`))
const fail = Promise.reject('Err');
// 将会显示 "Failed with: Err"
fail.
then(result => console.log(`Successful result: ${result}`)).
catch(e => console.log(`Failed with: ${e}`))
组合 Promise
- 进行HTTP请求,等待完成,打印结果;
- 然后进行其他两个并行HTTP调用;
- 当它们都完成时,打印结果。 以下代码段演示了如何完成此操作:
//进行第一个调用
const call1Promise = rp('http://example.com/'); // Line 2 call1Promise.then(result1 => {
//在第一个请求完成后执行
console.log(result1); const call2Promise = rp('http://example.com/'); // Line 8
const call3Promise = rp('http://example.com/'); // Line 9 return Promise.all([call2Promise, call3Promise]); // Lin 11
}).then(arr => { // Line 12
//两个 promise 完成后执行
console.log(arr[0]);
console.log(arr[1]);
})

计算过程中的 Promise 组合。我们使用“Promise.all”将两个并发的 Promise组合成一个 Promise。
Async
function f() {
return Promise.resolve('TEST');
}
// asyncF相当于f!
async function asyncF() {
return 'TEST';
}
function f() {
return Promise.reject('Error');
}
// asyncF相当于f!
async function asyncF() {
throw 'Error';
}
Await
async function f() {
// 返回值将作为 promise 被处理(resolve)之后的结果
const response = await rp('http://example.com/');
console.log(response);
}
// 不能在 async 函数之外使用 await 关键字
// 需要使用 then 回调
f().then(() => console.log('Finished'));
// 将解决问题的方法封装到一个异步的函数中
async function solution() {
// 等待第一个 HTTP 调用并且打印出结果
console.log(await rp('http://example.com/')); // 生成 HTTP 调用但是不等待它们执行完毕 - 同时运行
const call2Promise = rp('http://example.com/'); // 不等待! // Line 7
const call3Promise = rp('http://example.com/'); // 不等待! // Line 8 //在它们都被调用之后 - 等待它们执行完毕
const response2 = await call2Promise; // Line 11
const response3 = await call3Promise; // Line 12 console.log(response2);
console.log(response3);
} // 调用 async 函数
solution().then(() => console.log('Finished'))
async function f() {
console.log('Starting F');
const result = await rp('http://example.com/');
console.log(result);
}

错误处理
async function f() {
try{
const promiseResult = await Promise.reject('Error');
} catch (e) {
console.log(e);
}
}
async function f() {
// 抛出异常
const promiseResult = await Promise.reject('Error');
}
// 将打印 "Error"
f().
then(() => console.log('Success')).
catch(err => console.log(err))
async function g() {
throw "Error";
}
// 将打印 “Error”
g().
then(() => console.log('Success')).
catch(err => console.log(err))
讨论
async function fAsync() {
// 事实上返回值是 Promise.resolve(5)
return 5;
}
// 不能调用 await fAsync(), 需要使用 then/catch
fAsync().then(r => console.log(`result is ${r}`));

图解 Await 和 Async的更多相关文章
- 小心C# 5.0 中的await and async模式造成的死锁
平时在使用C# 5.0中的await and async关键字的时候总是没注意,直到今天在调试一个ASP.NET项目时,发现在调用一个声明为async的方法后,程序老是莫名其妙的被卡住,就算声明为as ...
- await和async关键字来写异步程序
await和async关键字出现于.Net5.0,方便写异步程序. 例子: public class MyClass { public MyClass() { DisplayValue(); //这里 ...
- C#同步,异步的理解,包括5.0中await和async(学习笔记)
之前在工作中一直用的是同步线程,就是先进入画面的load事件,然后在里面进行数据库调用的处理.后面又遇到了公司软件中一些比较古老的代码,一开始在那块古老代码中增加机能的时候,我想用到数据库的数据给画面 ...
- 【笔记】记一次.net语法await和async的异步编程实验与笔记。
1.实践代码全记录: using System; using System.Collections.Generic; using System.Diagnostics; using System.Li ...
- await和async更多的理解
最近有不少网友提起await和async,呵呵,C# 5引进的语法糖. 这个语法糖还真不好吃,能绕倒一堆初学的朋友,在网上也有很多网友关于这块知识点的争论,有对有错,今天在这里把这个误区好好讲讲. 在 ...
- C#语法——await与async的正确打开方式
C#5.0推出了新语法,await与async,但相信大家还是很少使用它们.关于await与async有很多文章讲解,但有没有这样一种感觉,你看完后,总感觉这东西很不错,但用的时候,总是想不起来,或者 ...
- C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别
C#语法——泛型的多种应用 本篇文章主要介绍泛型的应用. 泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性.类型安全性和效率. 泛型的定义 下面定义了 ...
- await和async在一般处理程序中的使用
写在前面 有个小项目,前端使用的html页面,那服务端的业务处理就采用最简单的一般处理程序了,之前一直在用,觉得一直用一种方式,确实挺蛋疼的,之前也有了解过async和await的内容.就想着自己折腾 ...
- C#异步编程のawait和async关键字来写异步程序
一.await和async关键字 .Net平台不断推出了新的异步编程模型,在.net4.5中加入了关键字await和async,顾名思义,await是指方法执行可等待,即可挂起直到有结果(不是必须立即 ...
随机推荐
- Vue Elementui 表单必填项和非必填项label文字对齐的简单方式
1. 不好的方式 很长时间以来都是用改写form-item样式来使得必填项和非必填项保证label对齐,这样需要改写系统样式,还要在相应的item上引用,代码量增多,示例如下(不推荐) <tem ...
- K8s集群verification error" while trying to verify candidate authority certificate "kubernetes"
问题内容 because of "crypto/rsa: verification error" while trying to verify candidate authorit ...
- Homekit_二路继电器
介绍一款二路继电器,使用Homekit进行控制,有兴趣的可以去以下链接看看: https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-11265006 ...
- Android 开发学习进程0.16 layout_weight属性 R文件关联XML Module
layout_weight属性 layout_weight属性我们常常用到,但有时候会发现它还有一些奇怪的属性,比如大多数使用时会把宽度设置成0,但要是宽度不设置成0会有什么效果? layout_we ...
- Js~对键值对操作
键值对主要是面向对象语言里的字典,或者叫哈希表,它通过键(key)可以直接访问到值(value),所以它查找的时间复杂度是O(1),即一次查找即可找到目标:在.net里有Dictionary,而在ja ...
- name 'xrange' is not defined
出现这个错误是因为examples使用的是Python2 在Python3中,移除了在Python2中的range, 并将 xrange 命名为 range 将代码中的xrange改为range就可以 ...
- 实体类转xml
看项目中需要实体类转xml,大家是拼接的.感觉可以利用反射实现.于是写了下 代码如下 package com.kevin.util; import org.springframework.util.O ...
- 简述 jpg png gif png-8 png-24 的区别
Gif 格式的特点: 1.透明性,GIF是一种布尔透明类型,既可以是全透明,又可以是不透明,但是不可以半透明: 2.动画 GIF支持动画. 3.无损耗性 GIF是一种无损耗的图像格式,也 ...
- 哲思集-转载自CSDN
CSDN 创始人蒋涛:世界被编码之后 分享赚¥9.90订阅博主 “写代码 20 年,通过网络平台和社区,帮助中国的程序员更好成长,这是我最希望被大家记住的.”这是蒋涛接受 ZAKER 采访的开场白. ...
- Today At AntDock 2020年8月21日
前段时间,我在 Mac 上使用 CLion 进行 C++ 编译,但发现 #include<bits/stdc++.h> 居然出了问题,无法使用,Xcode 也不行.我试图查找资料,但一般都 ...