讲述完工具人的起源
方函式:终於到了最後一个能力async
模式。
我:到现在都遇不到JS...
先知道async
跟generator
使用方式非常相似,
generator
:用yield
控制流程
async
:用await
控制
两者差别在於async
回传的是一个Promise
物件而不是{value:any,done:Boolean}
。
generator
的可参考我在D14写关於生成器的文章async function
建构子建立,基本架构为:
//宣告
async function adds(){
....;
};
//装入变数
const x = async function()=>{}
当async
被呼叫时,会回传一个Promise
物件:
Promise
的状态为resolve
,并回传值。Promise
状态则为reject
并回传值。async
回传背後的道理不知道你会不会好奇,当你呼叫async
里面看起来回传1
,实际上却是Promise
物件,背後是什麽道理。
当async
回传1
async function asyncFn(){
return 1;
}
asyncFn();
是不是会得到相同的结果,原因是当你用async
时,它会偷偷帮你转译,所以实际上它长得就像是:
function normal(){
return Promise.resolve(1);
}
normal();
await
数量不限,可写可不写
async
内使用,在async function
以外用会syntax error
,function hi(){
await console.log(x);
}
hi()
Promise
处理非同步使用async function add(){
await setTimeout((x=1)=>console.log(x),20000);
console.log("x")
}
add()
之所以可以这样使用,是因为当你使用非Promise
的非同步语法时,它会自动将你输出预设为resolve
,并回传值。
加入awiat
就能避免流程被setTimeout
卡顿。
Promise
都怎麽用呢?await
後面会是new Promise
async function add(){
await new Promise((resolve,reject)=>{
resolve("accept");
reject("deny")
});
await new Promise((resolve,reject)=>{
resolve("accept1");
reject("deny2")
});
}
add()
async
vs Promise
从可读性比较假设你现在有三件事情想依序被执行
Promise
若用Promise
,就是透过then()
去串连
function a() {
return new Promise((resolve, reject) => resolve("hi a"));
}
function b() {
return new Promise((resolve, reject) => resolve("hi b"));
}
function c() {
return new Promise((resolve, reject) => resolve("hi c"));
}
a()
.then(function (x) {
console.log(x);
return b();
})
.then(function (x) {
console.log(x);
return c();
})
.then((y) => console.log(y));
async
async function hi() {
let res1 = await new Promise((resolve, reject) => resolve("hi a"));
let res2 = await new Promise((resolve, reject) => resolve("hi b"));
let res3 = await new Promise((resolve, reject) => resolve("hi c"));
console.log(res1);
console.log(res2);
console.log(res3);
}
hi();
比较起来,是不是好读许多呢?
-- to be continued --
一切都要结束了?
那今天就到这边搂!
每天的休息,是为了後面的追求,明天见。
MDN
Async & Await
<<: 那些被忽略但很好用的 Web API / Geolocation
>>: Day 29 - styled-components 笔记4
1.preliminaries 要如何选定特徵与要做甚麽样的分类 step1:要先定做怎样的分类 s...
孩子玩滑板时,不要干扰他们 Do not bother children when they ar...
上面这个是今天会提到的内容,如果你已经可以轻松看懂,欢迎直接左转去看我同事的精彩文章 — 「Fro...
当同时进行多个专案,每个专案又有上百个工作项目待执行的时候,看板方法可以非常有条理的呈现专案状态。我...
Todolist 是JavaScript入门中的基础实作,能够练习基础的DOM操作。身为一个初学者就...