導航:首頁 > 編程語言 > js非同步編程的方法

js非同步編程的方法

發布時間:2022-06-05 12:58:29

① 關於js非同步回調的問題,如下,謝謝啦。

// 1 編寫一個非同步回調函數a(b,c),延遲b秒,輸出信息c
function funcOne(b,c){
setTimeout(() => console.log(c), b * 1000)
}

funcOne(5, "hello")

// 2 採用非同步回調,編程過3秒後輸出「1」,再過2秒後輸出「2」,再過1秒後輸出「3」。

function funcTwo(){
setTimeout(() => {
console.log(3)
setTimeout(() => {
console.log(2)
setTimeout(() => console.log(1), 1000)
}, 2000)
}, 3000)
}

funcTwo()

// 3 採用Promise,編程過3秒後輸出「1」,再過2秒後輸出「2」,再過1秒後輸出「3」。
function funcThree(){
return new Promise((resolve,reject)=>{
setTimeout(() => {
console.log(1)
setTimeout(() => {
console.log(2)
setTimeout(() => {
console.log(3)
resolve
}, 1000)
}, 2000)
}, 3000)
})
}
funcThree()

// 4 採用async/await,編程過3秒後輸出「1」,再過2秒後輸出「2」,再過1秒後輸出「3」。

async function funcFour(){
return await funcThree()
}

funcFour()

② 下面哪些方法可以用作javascript非同步模式的編程

javascript語言是單線程機制。所謂單線程就是按次序執行,執行完一個任務再執行下一個。

對於瀏覽器來說,也就是無法在渲染頁面的同時執行代碼。

單線程機制的優點在於實現起來較為簡單,運行環境相對簡單。缺點在於,如果中間有任務需要響應時間過長,經常會導致

頁面載入錯誤或者瀏覽器無響應的狀況。這就是所謂的逗同步模式地,程序執行順序與任務排列順序一致。對於瀏覽器來說,

同步模式效率較低,耗時長的任務都應該使用非同步模式;而在伺服器端,非同步模式則是唯一的模式,如果採用同步模式個人認為

伺服器很快就會出現12306在高峰期的表現。。。。

非同步模式的四種方式:

1.回調函數callback

所謂回調函數,就是將函數作為參數傳到需要回調的函數內部再執行。

典型的例子就是發送ajax請求。例如:

$.ajax({

async: false,

cache: false,

dataType: 'json',

url: "url",

success: function(data) {

console.log('success');

},

error: function(data) {

console.log('error');

}

})

當發送ajax請求後,等待回應的過程不會堵塞程序運行,耗時的操作相當於延後執行。

回調函數的優點在於簡單,容易理解,但是可讀性較差,耦合度較高,不易於維護。

2.事件驅動

javascript可以稱之為是基於對象的語言,而基於對象的基本特徵就是事件驅動(Event-Driven)。

事件驅動,指的是由滑鼠和熱鍵的動作引發的一連串的程序操作。

例如,為頁面上的某個
$('#btn').onclick(function(){

console.log('click button');

});

綁定事件相當於在元素上進行監聽,是否執行注冊的事件代碼取決於事件是否發生。

優點在於容易理解,一個元素上可以綁定多個事件,有利於實現模塊化;但是缺點在於稱為事件驅動的模型後,流程不清晰。

3.發布/訂閱

發布訂閱模式(publish-subscribe pattern)又稱為觀察者模式(Observer pattern)。

該模式中,有兩類對象:觀察者和目標對象。目標對象中存在著一份觀察者的列表,當目標對象

的狀態發生改變時,主動通知觀察者,從而建立一種發布/訂閱的關系。

jquery有相關的插件,在這不是重點不細說了。。。。回頭寫個實現貼上來

4.promise模式

promise對象是CommonJS工作組提供的一種規范,用於非同步編程的統一介面。

promise對象通常實現一種then的方法,用來在注冊狀態發生改變時作為對應的回調函數。

promise模式在任何時刻都處於以下三種狀態之一:未完成(unfulfilled)、已完成(resolved)和拒絕(rejected)。以CommonJS
Promise/A
標准為例,promise對象上的then方法負責添加針對已完成和拒絕狀態下的處理函數。then方法會返回另一個promise對象,以便於形成promise管道,這種返回promise對象的方式能夠支持開發人員把非同步操作串聯起來,如then(resolvedHandler,
rejectedHandler); 。resolvedHandler
回調函數在promise對象進入完成狀態時會觸發,並傳遞結果;rejectedHandler函數會在拒絕狀態下調用。

Jquery在1.5的版本中引入了一個新的概念叫Deferred,就是CommonJS promise A標準的一種衍生。可以在jQuery中創建

$.Deferref的對象。同時也對發送ajax請求以及數據類型有了新的修改,參考JQuery API。

除了以上四種,javascript中還可以利用各種函數模擬非同步方式,更有詭異的諸如用同步調用非同步的case

只能用team里同事形容java和javascript的一句話作為結尾:

逗寫java像在高速路上開車,寫javascript像在草原上開車地-------------以此來形容javascript這種無類型的語言有多自由
but,如果草原上都是坑。

③ 前端開發中如何實現非同步編程

非同步編程其實很常見,特別是在出線Node.js之後,非同步編程更是讓很多開發者受益。那麼回到最初的地方,傳統的前端開發中如何實現非同步編程呢?下面列舉了js實現非同步編程的四種方式。
方法一:使用回調函數
方法二:事件監聽
可以定義一個事件,並為這個事件設定處理函數。這樣只有當這個時間發生的情況下,對應的處理函數才會被執行。

方法三:事件的發布/訂閱

這個模式在NodeJS以及其他JS框架中都有實現,是一個非常常用的非同步編程方式。具體的原理及實現方法可以參考我之前的博客:http://blog.csdn.net/fareise/article/details/52198877《 Node中EventEmitter以及如何實現JavaScript中的訂閱/發布模式》,裡面有比較詳細的解析。

方法四:Promise模式

ES6中提供了原生的Promise對象,這個模式最開始只是一個構想,後來由一些框架庫實現。Promise對象代表了未來才會知道結果的事件。

Promise的基本思路就是,將需要非同步執行的事件儲存起來,然後根據非同步事件之行後的結果狀態執行下一步的操作。具體的Promise對象的原理和ES6中的使用方法將在下一篇文章中更加深入的進行介紹。

④ web前端開發需要掌握的幾個必備技術

接下來由小編簡單的列舉出幾個前端開發中必須要學會的知識:

第一階段:

HTML+CSS:

HTML進階、CSS進階、div+css布局、HTML+css整站開發、

JavaScript基礎:

Js基礎教程、js內置對象常用方法、常見DOM樹操作大全、ECMAscript、DOM、BOM、定時器和焦點圖。

JS基本特效:

常見特效、例如:tab、導航、整頁滾動、輪播圖、JS製作幻燈片、彈出層、手風琴菜單、瀑布流布局、滾動事件、滾差視圖。

JS高級特徵:

正則表達式、排序演算法、遞歸演算法、閉包、函數節流、作用域鏈、基於距離運動框架、面向對象基礎、

JQuery:基礎使用

懸著器、DOM操作、特效和動畫、方法鏈、拖拽、變形、JQueryUI組件基本使用。


第二階段:

HTML5和移動Web開發

HTML5:

HTML5新語義標簽、HTML5表單、音頻和視頻、離線和本地存儲、SVG、WebSocket、Canvas.

CSS3:

CSS3新選擇器、偽元素、臉色表示法、邊框、陰影、background系列屬性改變、Transition、動畫、景深和深透、3D效果製作、Velocity.js框架、元素進場、出場策略、炫酷CSS3網頁製作。

Bootstrap:

響應式概念、媒體查詢、響應式網站製作、刪格系統、刪格系統原理、Bootstrap常用模板、LESS和SASS。

移動Web開發:

跨終端WEB和主流設備簡介、視口、流式布局、彈性盒子、rem、移動終端JavaScript事件、手機中常見JS效果製作、Zepto.js、手機聚劃算頁面、手機滾屏。


第三階段:

HTTP服務和AJAX編程

WEB伺服器基礎:

伺服器基礎知識、Apache伺服器和其他WEB伺服器介紹、Apache伺服器搭建、HTTP介紹。

PHP基礎:

PHP基礎語法、使用PHP處理簡單的GET或者POST請求、

AJAX上篇:

Ajax簡介和非同步的概念、Ajax框架的封裝、XMLHttpRequest對象詳細介紹方法、兼容性處理方法、Ajax框架的封裝、Ajax中緩存問題、XML介紹和使用。

AJAX下篇:

JSON和JSON解析、數據綁定和模板技術、JSONP、跨域技術、圖片預讀取和lazy-load技術、JQuery框架中的AjaxAPI、使用Ajax實現爆布流案例額。


第四階段:

面向對象進階

面向對象終極篇:

從內存角度到理解JS面向對象、基本類型、復雜類型、原型鏈、ES6中的面向對象、屬性讀寫許可權、設置器、訪問器。

面向對象三大特徵:

繼承性、多態性、封裝性、介面。

設計模式:

面向對象編程思維、單例模式、工廠模式、策略模式、觀察者模式、模板方法模式、代理模式、裝飾者模式、適配器模式、面向切面編程。


第五階段:

封裝一個屬於自己的框架

框架封裝基礎:

事件流、冒泡、捕獲、事件對象、事件框架、選擇框架。

框架封裝中級:

運動原理、單物體運動框架、多物體運動框架、運動框架面向對象封裝。

框架封裝高級和補充:

JQuery框架雛形、可擴展性、模塊化、封裝屬於傳智自己的框架。


第六階段:

模塊化組件開發

面向組件編程:

面向組件編程的方式、面向組件編程的實現原理、面向組件編程實戰、基於組件化思想開發網站應用程序。

面向模塊編程:

AMD設計規范、CMD設計規范、RequireJS,LoadJS、淘寶的SeaJS。


第七階段:

主流的流行框架

Web開發工作流:

GIT/SVN、Yeoman腳手架、NPM/Bower依賴管理工具、Grunt/Gulp/Webpack。

MVC/MVVM/MVW框架:

Angular.js、Backbone.js、Knockout/Ember。

常用庫:

React.js、Vue.js、Zepto.js。


第八階段:

HTML5原生移動應用開發

Cordova:

WebApp/NativeApp/HybirdApp簡介、Cordova簡介、與PhoneGap之間的關系、開發環境搭建、Cordova實戰(創建項目,配置,編譯,調試,部署發布)。

Ionic:

Ionic簡介和同類對比、模板項目解析、常見組件及使用、結合Angular構建APP、常見效果(下拉刷新,上拉載入,側滑導航,選項卡)。

ReactNative:

ReactNative簡介、ReactNative環境配置、創建項目,配置,編譯,調試,部署發布、原生模塊和UI組件、原生常用API。

HTML5+:

HTML5+中國產業聯盟、HTML5PlusRuntime環境、HBuilder開發工具、MUI框架、H5+開發和部署。


第九階段:

Node.js全棧開發:

快速入門:

Node.js發展、生態圈、Io.js、Linux/Windows/OSX環境配置、REPL環境和控制台程序、非同步編程,非阻塞I/O、模塊概念,模塊管理工具、開發流程,調試,測試。

核心模塊和對象:

全局對象global,process,console,util、事件驅動,事件發射器、加密解密,路徑操作,序列化和反序列化、文件流操作、HTTP服務端與客戶端。

Web開發基礎:

HTTP協議,請求響應處理過程、關系型資料庫操作和數據訪問、非關系型資料庫操作和數據訪問、原生的Node.js開發Web應用程序、Web開發工作流、Node.js開發Blog案例。

快速開發框架:

Express簡介+MVC簡介、Express常用API、Express路由模塊、Jade/Ejs模板引擎、使用Express重構Blog案例、Koa等其他常見MVC框架。

⑤ 怎樣用JS實現非同步轉同步

你可以使用回調函數,promise等實現非同步轉同步

⑥ nodeJS中,非同步的具體實現者是什麼

在現在的項目開發中,任何一個大型項目絕對不是簡簡單單的採用一個種語言和一種框架,因為每種語言和框架各有優勢,與其死守一個,不與取各家之所長,依次得到一個高性能、搞擴展的產品。

對於一個.NET開發者,尤其是主要從事Web開發的.NET程序員,個人覺得有必要學習一門性能優越的Web平台開發語言。一個開發者不能簡簡單單的只學習一門語言,思維應該開闊,從各個方面去看待同樣的一個問題,這樣或許會得到另一番效果和見解,個人認為應該學習一下其他的語言,這樣有利於我們對比語言的優勢和缺點,例如java、nodejs、python等等。對於Nodejs這個JavaScript平台,個人覺得.NET程序員有必要學習一下,因為學習NodeJS有助於我們構建一個高性能的Web平台。

NodeJS具有事件驅動、非阻塞I/O等特點,可以很好的處理I/O操作。Node面向網路且擅長並行I/O,能夠有效地組織起更多的硬體資源。

這篇博客就來簡單的介紹一下NodeJS的非同步I/O特點。

一.NodeJS概述:

要學習一個語言或者平台,我們首先應該知道其定義,依據定義來擴展我們的學習思路。Node的定義:」一個大獎在Chrome JavaScript運行時上的平台,用於構建高速、可伸縮的網路程序。NodeJS作為一個非同步事件驅動的JavaScript運行時,旨在構建可擴展的網路應用程序。「有關nodejs的背景介紹和安裝方法,這里就沒有必要介紹了,因為對於nodejs的安裝是比較簡單,所以在這里贅述就有些顯得浪費時間。

學習完Node的定義特點,可能很多人都會好奇這個平台的適用場景是什麼,以便在實際的項目開發中應用,不然學習這個就沒有意義。主要的應用場景:前後端編程語言環境統一;高性能I/O用於實時應用;並行I/O使得使用者可以更高效地利用分布式環境;並行I/O有效利用穩定介面提升Web渲染能力;雲平台的支持;游戲開發(這可能是很多開發者在意的,畢竟現在的游戲開發火熱程度已經到了無以附加的地步);工具類應用,與較多的工具方法,使得開發效率大大的提升。

NodeJS非同步I/O模型的基本要素:事件循環、觀察者、請求對象、I/O線程池這四個共同構成。接下來我們具體了解一下這些知識。

二.NodeJS非同步I/O解析:

對於Nginx伺服器,很多人都是比較的熟悉,Nginx採用純C編寫而成,用於做Web伺服器,在反向代理和負載均衡等服務方面有很好的優勢。Node與Nginx伺服器有著相似的地方,都是採用事件驅動。

瀏覽器中JavaScript在單線程上執行,而且還與UI渲染共用一個線程,JavaScript在執行的時候UI渲染和響應應是出於停滯狀態。(如果腳本執行的時間超過100毫秒,用戶就會感到頁面卡頓)。遇到這些情況,我們就會想到非同步的方式消除這些等待的問題,對於非同步和同步的概念就不做介紹了。

=接下來我們具體的來了解一下NodeJS的事件驅動和非阻塞I/O這些特點,了解這些對於我們更好的學習NodeJS開發和構建高性能的Web平台有更加深遠的意義。

1.I/O操作概述:

I/O操作對於任何一個開發者來說都不會陌生,現在我們就簡單的談一下NodeJS的I.O操作。I/O操作分為:單線程串列依次執行;多線程並行執行。這兩種方式各有優勢和缺點,多線程的代價在於創建線程和執行期線程上下文切換的開銷較大,並且多線程面臨鎖、狀態同步的問題。單線程安裝順序執行,在執行中任何一個稍慢都會導致後續執行代碼阻塞。對於任務的串列執行(概念上類似於同步執行)和任務的並行執行的描述有如下圖:

varconfig=require('./config.json');
varfs=require("fs");
varhttp=require('http');
varurl_mole=require("url");

http.createServer(function(request,response){
varkey=url_mole.parse(request.url).query.replace('key=','');
switch(request.method){
case'GET'://
fs.readFile(config.dataPath+key,'utf8',function(err,value){
if(err){
//ReturnFileNotFoundiffilehasn'tyetbeencreated
response.writeHead(404,{'Content-Type':'text/plain'});
response.end("Thefile("+config.dataPath+key+")doesnotyetexist.");
}else{
//Ifthefileexists,
varsorted=value.split(config.sortSplitString).sort().join('');
response.writeHead(200,{'Content-Type':'text/plain'});
response.end(sorted);
}
});
break;
case'POST'://
varpostData='';
request
.on('data',function(data){
postData+=data;
})
.on('end',function(){
fs.appendFile(config.dataPath+key,postData,function(err){
if(err){
//Returnerrorifunabletocreate/appendtothefile
response.writeHead(400,{'Content-Type':'text/plain'});
response.end('Error:Unabletowritefile:'+err);
}else{
//,return"success"response
response.writeHead(200,{'Content-Type':'text/plain'});
response.end('success');
}
});
});
break;
default:
response.writeHead(400,{'Content-Type':'text/plain'});
response.end("Error:BadHTTPmethod:"+request.method);
}
}).listen(config.serverPort);

console.log('synchronousserverisrunning:',config.serverPort);

四.總結:

這篇博文是個人初次嘗試NodeJS的一個小總結,如有寫的不好還望大家多多的包含和指正。對於程序員來說,需要做的就是一直不停的學習,無論是否是自己主要從事的語言,對於學習多種語言,可以更加有助我們了解編程,對於一個開發者來說,最終的就是思想,因為語言的特性和框架的應用,一個熟練的編程者學習起來並不是難事,難就難在我們對於語言和框架的設計理念的理解。

⑦ javascript中非同步操作的異常怎麼處理

什麼異常,可以把錯誤代碼貼一下嗎

⑧ 如何進行nodejs非同步編程

更新下,我之所以讓您玩一下AJAX,是希望您體驗一下非同步,並不是希望您了解AJAX這機制的實現方法,因為AJAX是一個特別典型且簡單的非同步場景,比如:
執行某個函數 -> 執行語句A,B,C,D -> 在D語句發起非同步請求,同時向引擎注冊一個回調事件 -> 執行E,F,G ->退出函數塊 ,引擎Loop...Loop...Loop,此時非同步的請求得到了Response,之前注冊的回調被執行。

閱讀全文

與js非同步編程的方法相關的資料

熱點內容
生意不忙怎麼解壓 瀏覽:500
歡太健康app在哪裡下載 瀏覽:488
androidtools使用教程 瀏覽:971
十天突破雅思口語pdf劍9 瀏覽:295
李誕笑場pdf 瀏覽:265
自用紙巾做解壓筆 瀏覽:129
銀行流水解壓碼是多少 瀏覽:895
百度哪個app好用 瀏覽:316
115廣告聯盟源碼 瀏覽:494
聯通app簽到源碼 瀏覽:680
怎麼連接另一個伺服器的資料庫 瀏覽:742
貓盤洗白命令 瀏覽:844
168api源碼 瀏覽:967
不同地方的文件伺服器如何通信 瀏覽:599
自己電腦上搭建ftp伺服器地址 瀏覽:977
程序員的秋招秘籍 瀏覽:821
單片機國內外研究現狀 瀏覽:308
gta5如何進千人真實伺服器 瀏覽:996
電腦html壁紙源碼 瀏覽:726
c語言返回命令 瀏覽:933