用最簡單的例子講解js中解決非同步的方法
解決js非同步的方法有很多中,今天就講解一下如何解決js中的非同步問題。
在講解非同步解決辦法之前我們需要知道什麼是非同步。定時器、AJAX、事件繫結等都會引起js的非同步行為,今天用js中的定時器為例來講解,看下題。
考慮下題中輸出的結果為:
function getData() {
setTimeout(function() {
let name = '張三';
return name;
}, 1000);
}
console.log(getData());
這裡就有很多人會說輸出的結果為張三,那就說明你還沒有真正理解非同步。其實真正的輸出結果為:undefined。這是因為setTimeout方法為非同步方法。如果不明白為什麼會這樣,這裡我講一下js的執行機制大家就會更加明白了。
js執行機制:
(1).所有同步任務都在主執行緒上執行,形成一個執行棧(execution context stack);
(2).主執行緒之外,還存在一個"任務佇列"(task queue),只要非同步任務有了執行結果,就在"任務佇列"之中放置一個事件;
(3).一旦"執行棧"中的所有同步任務執行完畢,系統就會讀取"任務佇列",看看裡面有哪些事件,那些對應的非同步任務,於是結束等待狀態,進入執行棧,開始執行;
(4).主執行緒不斷重複上面的第三步;
解決非同步的方法一(回撥函式):
function getData(callback) {
setTimeout(function() {
let name = '張三';
callback(name);
}, 1000);
}
getData(function(aaa){
console.log(aaa); //等待一秒之後輸出 張三
})
解決非同步的方法二(es6的Promise):
function getData(resolve, reject){
setTimeout(function() {
var name="張三";
resolve(name);
}, 1000);
};
var p = new Promise(getData);
p.then(function(data){
console.log(data);//等待一秒之後輸出 張三
})
解決非同步的方法三(es7的async/await):
async用於申明一個非同步的function,而await用於等待一個非同步方法執行完成。
async function getData(){ //通過async封裝非同步方法
return new Promise((resolve, reject) => {
setTimeout(function() {
var name = '張三';
resolve(name);
}, 1000);
})
}
async function main(){
var data = await getData();
console.log(data);//等待一秒之後輸出 張三
}
main();
以上就是處理非同步最常用的三種方法,不過第一種的回撥函式方法是es6之前的處理方法,容易造成回撥地獄,不易維護,不建議過多使用。
相關文章
- 最簡單的例子瞭解js中call()、apply()、bind()的區別和聯絡JSAPP
- JS中的非同步解決方案JS非同步
- python中yield的用法詳解——最簡單,最清晰的解釋Python
- Android中運算元據庫SQL語句的講解,簡單的查詢修改等操作學生類的例子講解AndroidSQL
- Android6.0動態許可權最簡單的解決方法Android
- 最簡單易懂的 Spring Security 身份認證流程講解Spring
- 用最簡單的方法實現原生 JS 放大鏡特效JS特效
- 用最基礎的方法講解 Redux 實現原理Redux
- 用簡單易懂的例子解釋隱馬爾可夫模型隱馬爾可夫模型
- 一個最簡單的 Github workflow 例子Github
- 最詳細的測試用例設計方法講解
- Android Rxjava :最簡單&全面背壓講解 (Flowable)AndroidRxJava
- 最安全的hexo多臺電腦同步部落格解決方案--非新建分支Hexo
- 一個簡單的例子瞭解async跟defer
- js 非同步的幾種解決方案JS非同步
- 簡單瞭解JS中的幾種遍歷JS
- Java中同步的基本概念監視器–最簡單粗暴的理解方法Java
- 成功解決PyCharm 彈出 Server‘s certificate is not trusted 的簡單解決方法PyCharmServerRust
- 一份簡單夠用的 Nginx Location 配置講解Nginx
- SpringBoot切面Aop的demo簡單講解Spring Boot
- asp.net 應用程式中同步方法呼叫非同步方法無響應解決方法ASP.NET非同步
- JS中toFixed()方法的問題及解決方案JS
- vue.js:最簡單的v-if運用Vue.js
- 使用Promise解決多層非同步呼叫的簡單學習Promise非同步
- spring mvc(註解)上傳檔案的簡單例子SpringMVC單例
- 多型 簡單講解多型
- 簡單易懂講註解
- Airtest簡單上手講解AI
- Python中Pandas 方法cut簡單講講Python
- 最簡單的大白話給你說明白js的非同步機制JS非同步
- 史上最詳細的 webpack 講解 1 (vue-cli 中 build.js)WebVueUIJS
- TCP、UDP、HTTP及Socket的簡單講解TCPUDPHTTP
- 使用NVRAM的簡單解決方案VR
- 初步講解JS中的callback回撥原理JS
- 簡單的瞭解跨域以及解決方案跨域
- 通過一個簡單的例子,瞭解 Cypress 的執行原理
- 樹狀陣列入門(簡單的原理講解)陣列
- 對於JS模組的簡單瞭解JS