# 异步编程 - Promise
# 课程目标
- 理解异步编程的基本概念,理解什么是异步
- 学习 promise 基础知识
# 异步回调
在学习 promise 之前我们先要理解什么是回调地狱。因为正是为了解决回调地狱这一问题,promise 才出现了
阅读下面的文章,回顾什么是回调,以及回调地狱是什么
- 简介:回调 | javascript (opens new window)
- 回调地狱 (opens new window)
- callback (opens new window)
- 回调模式 (opens new window)
# Promise
- JavaScript Promise API (opens new window)
- 第 3 章:Promise | 你不知道的 JS:异步与性能 (opens new window)
- MDN 使用 Promises (opens new window)
- MDN 优雅的异步处理 (opens new window)
- 廖雪峰 Promise (opens new window)
- JavaScript Promise:去而复返 (opens new window)
- JavaScript Promise 迷你书(中文版) (opens new window)
- 一文理解 JavaScript Promise (opens new window)
- 博客园 JavaScript 进阶之路——认识和使用 Promise,重构你的 Js 代码 (opens new window)
- 慕课网 Promise 入门 (opens new window)
- JavaScript Promise 迷你书 (opens new window)
- 浅谈 JS 异步编程 Promise 的使用 (opens new window)
# 任务一
实现延时
- 用 Promise 封装实现延时函数 wait,使其效果和 setTimeout 函数一致。
/**
* @param {number} milliseconds
*/
const sleep = (milliseconds) => {
// your code here
};
//测试用例
sleep(2000).then(() => {
//下面这句话会在执行了2s延时之后打印出来
console.log("我延时了2s");
});
- 用 Promise 封装实现延时函数 randomSleep,该函数实现随机等待 1-10 秒
const randomSleep = () => {
// your code here
};
//测试用例
console.log("STEP 1");
randomSleep().then(() => {
// randomSleep()函数执行完毕才打印 B
console.log("STEP 2");
});
console.log("STEP 3");
打印结果如下:
STEP 1
STEP 3
STEP 2
# 编码二
使用 Promise 模拟数据获取.假设您需要获取北京的天气信息
- 完成该 fakeFetchWeather(endpoint) 函数,使其返回一个承诺
- 当 endpointis 为"beijing"时,它应该返回一个承诺,该承诺会在 1 秒后使用以下对象成功解析:
{
city: "beijing",
temperature: 2
}
- 对于所有其他端点,它应该返回一个失败的承诺。您还可以传递错误消息,例如:"接口信息错误".
const fakeFetchWeather = (endpoint) => {
// TODO: 实现模拟获取天气信息
};
// 测试用例
fakeFetchWeather("beijing")
.then((data) => {
console.log(data);
})
.catch((error) => {
console.error(error);
});
//{ city:"beijing", temperature: 2}
fakeFetch("Paris")
.then((data) => {
console.log(data);
})
.catch((error) => {
console.error(error);
});
//接口信息错误
# 编码三
按照要求实现 mergePromise 函数,把传进去的函数数组按顺序先后执行,并且把返回的数据先后放到数组 data 中。 编写 JavaScript 代码,跑通如下测试用例
const timeout = (ms) =>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, ms);
});
const ajaxA = () =>
timeout(2000).then(() => {
console.log("A");
return A;
});
const ajaxB = () =>
timeout(1000).then(() => {
console.log("B");
return B;
});
const ajaxC = () =>
timeout(2000).then(() => {
console.log("C");
return C;
});
const mergePromise = (fetchArray) => {
// 在这里实现你的代码
};
//测试用例
mergePromise([fakeFetchWeather(), fakeFetchWeather(), fakeFetchWeather()]).then(
(data) => {
console.log("done");
console.log(data); // data 为 [A, B, C]
}
);
// 要求分别输出
// A
// B
// C
// done
// [A, B, C]
# 提交
把你觉得此次学习中做得最好的代码放在 Github 后进行提交。
# 总结
依然把今天的学习用时,收获,问题进行记录。
# 相关参考
书籍
- Eloquent JavaScript, 3rd Edition: Ch. 11 - Asynchronous Programming (opens new window)
- Exploring JS: Asynchronous Programming (opens new window)
文章
- Understanding async/await in Javascript — Gokul N K (opens new window)
- JavaScript Promises: an introduction (opens new window)
- Exploring Async/Await Functions in JavaScript — Alligator.io (opens new window)
- Asynchronous JavaScript: From Callback Hell to Async and Await — Demir Selmanovic (opens new window)
- Javascript — ES8 Introducing async/await Functions — Ben Garrison (opens new window)
- Asynchronous Operations in JavaScript — Jscrambler (opens new window)
视频
- Async + Await — Wes Bos (opens new window)
- Asynchrony: Under the Hood — Shelley Vohr (opens new window)
- async/await in JavaScript - What, Why and How — Fun Fun Function (opens new window)
- async/await Part 1 - Topics of JavaScript/ES8 — The Coding Train (opens new window)
- async/await Part 2 - Topics of JavaScript/ES8 — The Coding Train (opens new window)
← JavaScript 生成器 表格 →