消防中队网站建设,图片预览网站 末班,阿里云建站论坛网站,自己做一网站目录
1、编程语言中的异步
2、JavaScript
3、回调
#xff13;.#xff11;在回调中处理错误
#xff13;.#xff12;回调的问题
#xff13;.#xff12;回调的替代方案 1、编程语言中的异步
默认情况下#xff0c;JavaScript是同步的#xff0c;并且是单线程…目录
1、编程语言中的异步
2、JavaScript
3、回调
.在回调中处理错误
.回调的问题
.回调的替代方案 1、编程语言中的异步
默认情况下JavaScript是同步的并且是单线程的。这意味着代码不能创建新的线程并并行运行。了解异步代码的含义及其外观
计算机在设计上是异步的。
异步意味着事情可以独立于主程序流发生。
在当前的消费者计算机中每个程序都在特定的时间段内运行然后停止执行让另一个程序继续执行。这东西以如此之快的速度循环运行以至于不可能被注意到。我们认为我们的计算机同时运行许多程序但这只是一种幻觉在多处理器机器上除外。
程序内部使用中断这是一种发送到处理器以引起系统注意的信号。
现在我们不讨论它的内部内容但请记住程序异步并在需要注意之前停止执行是正常的这样计算机就可以同时执行其他事情。当程序正在等待来自网络的响应时在请求完成之前它无法停止处理器。
通常编程语言是同步的有些语言提供了一种管理语言中异步性或通过库来管理异步性的方法。C、 默认情况下Java、C#、PHP、Go、Ruby、Swift和Python都是同步的。其中一些通过使用线程来处理异步操作从而生成新的进程。
2、JavaScript
默认情况下JavaScript是同步的并且是单线程的。这意味着代码不能创建新的线程并并行运行。
// 代码行一行接一行地串行执行例如
const a 1;
const b 2;
const c a * b;
console.log(c);
doSomething();
但JavaScript来源于浏览器内部其主要工作一开始是响应用户操作如onClick、onMouseOver、onChange、onSubmit等。它如何使用同步编程模型来做到这一点
答案在于它所处的环境。浏览器通过提供一组可以处理此类功能的API提供了一种实现这一点的方法。
最近Node.js引入了一个非阻塞I/O环境将这一概念扩展到文件访问、网络调用等。
3、回调
您无法知道用户何时要单击某个按钮。因此您为单击事件定义了一个事件处理程序。此事件处理程序接受一个函数该函数将在触发事件时调用
document.getElementById(button).addEventListener(click, () {// item clicked
});
这就是所谓的回调。
回调是一个简单的函数它作为值传递给另一个函数并且只有在事件发生时才会执行。我们之所以能做到这一点是因为JavaScript具有一流的函数这些函数可以分配给变量并传递给其他函数称为高阶函数
通常将所有客户端代码封装在窗口对象上的加载事件侦听器中该侦听器仅在页面准备就绪时运行回调函数
window.addEventListener(load, () {// window loaded// do what you want
});
回调在任何地方都可以使用而不仅仅是在DOM事件中。
一个常见的例子是使用计时器
setTimeout(() {// runs after 2 seconds
}, 2000);
XHR请求也接受回调在本例中通过将函数分配给在特定事件发生时将被调用的属性在这种情况下请求的状态会发生变化
const xhr new XMLHttpRequest();
xhr.onreadystatechange () {if (xhr.readyState 4) {xhr.status 200 ? console.log(xhr.responseText) :console.error(error);}
};
xhr.open(GET, https://yoursite.com);
xhr.send();
.在回调中处理错误
如何处理回调错误一个非常常见的策略是使用Node.js所采用的方法任何回调函数中的第一个参数都是error对象然后是回调数据。
如果没有错误则该对象为null。如果出现错误它会包含一些错误描述和其他信息。
const fs require(fs);
fs.readFile(/file.json, (err, data) {if (err) {// handle errorconsole.log(err);return;}
// no errors, process dataconsole.log(data);
});
.回调的问题
回调非常适合简单的案例
然而每次回调都会添加一定程度的嵌套当您有很多回调时代码会很快变得复杂
window.addEventListener(load, () {document.getElementById(button).addEventListener(click, () {setTimeout(() {items.forEach(item {// your code here});}, 2000);});
});
这只是一个简单的4级嵌套代码但我想到了更多级别的嵌套情况。
.回调的替代方案
从ES6开始JavaScript引入了几个功能帮助我们处理不涉及使用回调的异步代码
PromisesES6和 Async/AwaitES2017。