首頁 web前端 js教程 什麼是JavaScript異步

什麼是JavaScript異步

Dec 02, 2017 am 09:05 AM
javascript js 非同步

作為剛接觸程式設計師小白,我們經常會遇到一些很簡單的問題,但是我們不知道怎麼回事,就像你要從後台調用數據,顯示在前台頁面,但是輸出結果總是空undefined,得不到數據。這是什麼原因呢?多方找資料才發現,原來是入了JS非同步的「坑」。沒錯這篇文章我們主要跟大家分享一下JS的非同步操作是怎麼樣的。

我們常常聽到單執行緒、多執行緒、同步、非同步這些概念,那麼這些東西到底是什麼呢?
那麼我們先從上面那幾個概念說起

單執行緒、多執行緒、同步、非同步基本理解

##每個正在執行的程式(即行程)至少有一個線程,被稱為主線程。主線程在啟動程序時被創建,用於執行main函數。

1.單線程就是只有一個主線的線程,代碼從上往下順序運行,主線程負責執行程序的所有代碼(UI展現以及刷新,網絡請求,本地存儲等等)【一個線程要做所有的事情,想想都有點累呢】


2.多線程顧名思義,就是有多個線程的程序,可以由用戶自主創建。使用者自主創建的若干進程相對於主執行緒而言就是子執行緒。子執行緒和主執行緒都是獨立的運行單元,各自的執行互不影響,因此能夠並發執行。


光聽這些乾巴巴的理論是不是覺得有點暈? 巧了,乍看之下的時候也暈。


在找資料的過程中,我發現了別人的這麼一個形象的比喻。

打個比方,單線程就是你去廚房又燒飯又燒菜,一個人來回跑;多線程就是兩個人,一個單做飯,一個單做飯。

這麼說,應該更了解吧?

而什麼又是同步和非同步呢?

我們用一個簡單的生活例子來說明。

你打電話訂飯店,問工作人員有沒有房間,這時候,工作人員需要尋找有沒有房間才能回答你。

同步就是不掛電話一直等,直到工作人員告訴你有沒有房間。

非同步就是掛斷電話,你去做別的事情,例如吃飯喝水,工作人員查到了訊息再打電話告訴你。

那麼我們的主題來了

JS的非同步操作是怎麼樣的呢?


JS的執行環境是單執行緒的,也就是說,程式順序執行下來,一次只能執行一個任務,程式想要往下運行,就必須等待目前的任務執行完畢,不管目前的任務要執行多久(要是後面的程式急著跑出來可真的是等的很難受呢)。

為了解決後面程式等的難受的這個阻塞問題。 JavaScript有一種非同步處理模式,其實就是延時處理。

我們再來拋出例子來說明。

var getUserInfo = function () {
      $.getJSON("http://www.easy-mock.com/mock/5a09868228b23066479b8379/ajaxData/getUserInfo", function () {
        return data;
      });
    }
    var data = getUserInfo();
    renderUserInfo(data)
登入後複製

getUserInfo這個函數被調用,要取後台取數據,可能要耗費很多時間,這就要讓renderUserInfo一直等著,直到取出data才能運行。幸好JS有非同步操作,取資料的時候,不用renderUserInfo一直等data取出來,而是直接執行。

這麼說的話,那麼這兩個函數到底是什麼順序執行的吶?不急,我們來調試:

var getUserInfo = function () {
      console.log('aaa');
      $.getJSON("http://www.easy-mock.com/mock/5a09868228b23066479b8379/ajaxData/getUserInfo", function () {
        console.log('bbb');
        return data;
      });
    }
    var data = getUserInfo();
    console.log(data);
    console.log('ccc');
    renderUserInfo(data);
登入後複製

順序執行下來的輸出原以為是"aaa","bbb","ccc"吧?

然而事情並沒有這麼簡單。我們來看一下控制台的輸出:

輸出的結果竟然不是順序的。


也就是說函數執行到getJSON取資料的時候,程式並沒有等它取出資料再執行下一步,而是跳過了取資料這一階段,直接執行輸出data了,因此,data也為空。

這就是JS的非同步機制了。

以上內容就是關於JavaScript異步的詳解,希望能幫助大家 。

相關推薦:

JS非同步實作Generator的方法

JS非同步載入方法

詳解js非同步檔案載入器#

以上是什麼是JavaScript異步的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

建議:優秀JS開源人臉偵測辨識項目 建議:優秀JS開源人臉偵測辨識項目 Apr 03, 2024 am 11:55 AM

人臉偵測辨識技術已經是一個比較成熟且應用廣泛的技術。而目前最廣泛的網路應用語言非JS莫屬,在Web前端實現人臉偵測辨識相比後端的人臉辨識有優勢也有弱勢。優點包括減少網路互動、即時識別,大大縮短了使用者等待時間,提高了使用者體驗;弱勢是:受到模型大小限制,其中準確率也有限。如何在web端使用js實現人臉偵測呢?為了實現Web端人臉識別,需要熟悉相關的程式語言和技術,如JavaScript、HTML、CSS、WebRTC等。同時也需要掌握相關的電腦視覺和人工智慧技術。值得注意的是,由於Web端的計

股票分析必備工具:學習PHP和JS繪製蠟燭圖的步驟 股票分析必備工具:學習PHP和JS繪製蠟燭圖的步驟 Dec 17, 2023 pm 06:55 PM

股票分析必備工具:學習PHP和JS繪製蠟燭圖的步驟,需要具體程式碼範例隨著網路和科技的快速發展,股票交易已成為許多投資者的重要途徑之一。而股票分析是投資人決策的重要一環,其中蠟燭圖被廣泛應用於技術分析。學習如何使用PHP和JS繪製蠟燭圖將為投資者提供更多直觀的信息,幫助他們更好地做出決策。蠟燭圖是一種以蠟燭形狀來展示股票價格的技術圖表。它展示了股票價格的

PHP與JS開發技巧:掌握繪製股票蠟燭圖的方法 PHP與JS開發技巧:掌握繪製股票蠟燭圖的方法 Dec 18, 2023 pm 03:39 PM

隨著網路金融的快速發展,股票投資已經成為了越來越多人的選擇。而在股票交易中,蠟燭圖是常用的技術分析方法,它能夠顯示股票價格的變動趨勢,幫助投資人做出更精準的決策。本文將透過介紹PHP和JS的開發技巧,帶領讀者了解如何繪製股票蠟燭圖,並提供具體的程式碼範例。一、了解股票蠟燭圖在介紹如何繪製股票蠟燭圖之前,我們首先需要先了解什麼是蠟燭圖。蠟燭圖是由日本人

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

js和vue的關係 js和vue的關係 Mar 11, 2024 pm 05:21 PM

js和vue的關係:1、JS作為Web開發基石;2、Vue.js作為前端框架的崛起;3、JS與Vue的互補關係;4、JS與Vue的實踐應用。

Python asyncio 進階指南:從初學者到專家 Python asyncio 進階指南:從初學者到專家 Mar 04, 2024 am 09:43 AM

並發和非同步編程並發編程處理同時執行的多個任務,非同步編程是一種並發編程,其中任務不會阻塞線程。 asyncio是python中用於非同步程式設計的函式庫,它允許程式在不阻塞主執行緒的情況下執行I/O操作。事件循環asyncio的核心是事件循環,它監控I/O事件並調度相應的任務。當一個協程準備好時,事件循環會執行它,直到它等待I/O操作。然後,它會暫停協程並繼續執行其他協程。協程協程是可暫停和恢復執行的函數。 asyncdef關鍵字用於建立協程。協程使用await關鍵字等待I/O作業完成。 asyncio的基礎以下

如何在JavaScript中取得HTTP狀態碼的簡單方法 如何在JavaScript中取得HTTP狀態碼的簡單方法 Jan 05, 2024 pm 01:37 PM

JavaScript中的HTTP狀態碼取得方法簡介:在進行前端開發中,我們常常需要處理與後端介面的交互,而HTTP狀態碼就是其中非常重要的一部分。了解並取得HTTP狀態碼有助於我們更好地處理介面傳回的資料。本文將介紹使用JavaScript取得HTTP狀態碼的方法,並提供具體程式碼範例。一、什麼是HTTP狀態碼HTTP狀態碼是指當瀏覽器向伺服器發起請求時,服務

Java異常處理中的非同步與非阻塞技術 Java異常處理中的非同步與非阻塞技術 May 01, 2024 pm 05:42 PM

非同步和非阻塞技術可用於補充傳統異常處理,允許創建更具響應性和高效的Java應用程式:非同步異常處理:在另一個執行緒或進程中處理異常,讓主執行緒繼續執行,避免阻塞。非阻塞異常處理:涉及I/O操作出錯時事件驅動的異常處理,避免阻塞線程,由事件循環處理異常。

See all articles