我的第一篇文章!
一.什么用
同步程序按照我们书写代码的顺序一行一行地执行程序。
异步编程技术使程序启动一个可能长期运行的任务(IO 通常要比 CPU 慢上好几个数量级)并立即返回,从而继续对其他事件做出反应而不必等待任务完成;当操作最终完成时,通知我们操作的结果。
-
异步朴素实现Callback
回调函数是一个被传递到另一个函数中会在适当时候被调用的函数,曾经是 JavaScript 中实现异步函数的主要方式。当回调函数本身需要调用其他同样接受回调函数的函数时,基于回调的代码会变得难以理解。嵌套回调,处理错误也会变得非常困难:你必须在“金字塔”的每一级处理错误,而不是在最高一级一次完成错误处理。
fs.readFile(A, 'utf-8', function(err, data) {
fs.readFile(B, 'utf-8', function(err, data) {
fs.readFile(C, 'utf-8', function(err, data) {
fs.readFile(D, 'utf-8', function(err, data) {
//....
});
});
});
});
-
事件处理程序
事件处理程序实际上就是异步编程的一种形式:你提供的函数(事件处理程序)将在事件发生时被调用(而不是立即被调用)。
document.querySelector('#reload')
.addEventListener('click', () => {
log.textContent = '';
document.location.reload();
});
-
语法糖Promise
Promise 是现代 JavaScript 异步编程的基础。它避免了深度嵌套回调,使表达和理解异步操作序列变得更加容易,并且它们还支持一种类似于同步编程中 try...catch 语句的错误处理方式。
const fetchPromise = fetch('https://mdn.github.io/learning-area/javascript/apis/fetching-data/can-store/products.json');
fetchPromise
.then( response => {
return response.json();
})
.then( json => {
console.log(json[0].name);
});
二. 怎么用
每一个promise对象都会提供一个then方法或者是catch方法
somePromise().then(function () {
// I'm inside a then() function!
});
somePromise().catch(function () {
// I'm inside a catch() function!
});
在then或catch中有三种事可以做:
- 返回另一个promise;
- 返回一个同步值(或者undefined)
- 抛出一个同步错误。
getUserByName('zc')
.then(function (user) {
if (user.isLoggedOut()) {
// 抛出一个同步错误!
throw new Error('user logged out!');
}
if (inMemoryCache[user.id]) {
//返回一个同步值!
return inMemoryCache[user.id];
}
// 返回另一个promise!
return getUserAccountById(user.id);
})
.then(function (userAccount) {
// 处理userAccount!
})
.catch(function (err) {
// 处理error!
});