導航:首頁 > 編程語言 > js非同步編程方式有哪些

js非同步編程方式有哪些

發布時間:2023-01-16 18:15:48

① 如何進行nodejs非同步編程

題主需要補充一下非同步和同步的基礎知識。
nodejs的IO操作都是非同步的,打一個簡單的比方:
1. 把用戶許可權存到資料庫
2. 把用戶許可權從資料庫取出來
一般的後台語言(比如java):
這兩步操作一般寫作同步操作,也就是說代碼按照順序執行這2個方法就好。
如果是nodejs:
先執行函數1,然後在函數1的回調函數中調用函數2。
如果java的寫法,就會出現存和取的操作請求同時發起,最終函數2 的結果可能有數據,也可能沒數據。
至於你說的第二段中的不然注冊用戶等太久的說法是不存在的,這不是非同步和同步的問題,這是資料庫連接並發的問題,一般是通過資料庫連接池搞定的

② js非同步載入的方式有哪些

方法一:Script Dom Element

(function(){
var scriptEle = document.createElement("script");
scriptEle.type = "text/javasctipt";
scriptEle.async = true;
scriptEle.src = "http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js";
var x = document.getElementsByTagName("head")[0];
x.insertBefore(scriptEle, x.firstChild);
})();
方法二:onload時的非同步載入
function(){
if(window.attachEvent){
window.attachEvent("load", asyncLoad);
}else{
window.addEventListener("load", asyncLoad);
}
var asyncLoad = function(){
var ga = document.createElement('script');
ga.type = 'text/javascript';
ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
}
})();

方法三:$(document).ready()

③ 如何進行nodejs非同步編程

沒辦法回答你,nodejs的非同步說穿了就是callback機制,比如前台的ajax請求中當 success 事件觸發時調用相應的處理函數就是典型的callback,也就是非同步。但是在 nodejs 中這個用的更廣泛,大部分的請求都可以附加callback處理(比如執行資料庫操作)。具體怎麼寫看看文檔就知道了,主要是你要有非同步的思想, 思想的轉變別人是幫不到你的。加油吧。

④ 幾個js非同步編程工具的區別

下面給你介紹三種:

方法一 setTimeout

常用於:定時器,動畫效果

用法:setTimeout(func|code, delay)

缺點:

setTimeout
的主要問題在於,它並非那麼精確。譬如通過setTimeout()設定一個任務在10毫秒後執行,但是在9毫秒之後,有一個任務佔用了5毫秒的CPU時間片,再次輪到定時器執行時,時間就已經過期4毫秒 —-《深入淺出Nodejs》

方法二 事件監聽

任務的執行不取決於代碼的順序,而取決於某個事件是否發生。

用法:f1.on(『done』, f2);

優點:比較容易理解,可以綁定多個事件,每個事件可以指定多個回調函數,而且可以」去耦合」,有利於實現模塊化。

缺點:整個程序都要變成事件驅動型,運行流程會變得很不清晰。

方法三 回調函數

這是非同步編程最基本的方法。

假定有兩個函數f1和f2,後者等待前者的執行結果。

f1();

f2();

如果f1是一個很耗時的任務,可以考慮改寫f1,把f2寫成f1的回調函數。

function f1(callback){

setTimeout(function () {

// f1的任務代碼

callback();

}, 1000);

}

執行代碼就變成下面這樣:

f1(f2);

採用這種方式,我們把同步操作變成了非同步操作,f1不會堵塞程序運行,相當於先執行程序的主要邏輯,將耗時的操作推遲執行。

回調函數的優點是簡單、容易理解和部署,缺點是不利於代碼的閱讀和維護,各個部分之間高度耦合(Coupling),流程會很混亂,而且每個任務只能指定一個回調函數。

⑤ 如何進行nodejs非同步編程

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

⑥ Async.js非同步隊列編程庫基本使用介紹

Array | Iterable | AsyncIterable | Object的集合

需要執行的非同步函數:有2種方式,普通帶回調的函數,在函數之後最後必須調用回調函數傳入err和result。如果err為空,則表明當前非同步操作成功,將繼續下一個非同步執行,如果傳入err不為空,則整個非同步隊列任務的狀態即為false終止執行下面的任務。

另一種方式是es7的 async 函數,將return的值(即resolve的值)定義為此次的返回值,如果異常則自動將異常信息(即reject值)用於error信息

所有非同步方法執行之後的回調函數,參數為err,results

如果方法中沒有傳入callback參數,則返回promise

方式一:傳入callback

方式二:不傳入callback,使用promise的then、catch方式

非同步隊列函數,同一時間並發執行的的函數的數量,仍屬於非同步,只不過做了每次執行的數量限制

非同步串列執行,必須等到前一個非同步任務狀態sucess,才執行下一個任務。

⑦ js如何非同步執行方法

var xmlHttp;
function createXMLHttpRequest(){
//Mozilla 瀏覽器(將XMLHttpRequest對象作為本地瀏覽器對象來創建)
if(window.XMLHttpRequest){ //Mozilla 瀏覽器
xmlHttp = new XMLHttpRequest();
}else if(window.ActiveXObject) { //IE瀏覽器
//IE瀏覽器(將XMLHttpRequest對象作為ActiveX對象來創建)
try{
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){}
}
}
if(xmlHttp == null){
alert("不能創建XMLHttpRequest對象");
return false;
}
}
//用於發出非同步請求的方法
function sendAsynchronRequest(url,parameter,callback){
createXMLHttpRequest();
if(parameter == null){
//設置一個事件處理器,當XMLHttp狀態發生變化,就會出發該事件處理器,由他調用
//callback指定的javascript函數
xmlHttp.onreadystatechange = callback;
//設置對拂去其調用的參數(提交的方式,請求的的url,請求的類型(非同步請求))
xmlHttp.open("GET",url,true);//true表示發出一個非同步的請求。
xmlHttp.send(null);
}else{
xmlHttp.onreadystatechange = callback;
xmlHttp.open("POST",url,true);
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
xmlHttp.send(parameter);
}
}
//以上代碼是通用的方法,接下來是調用以上的方法
function loadPros(title,count,pid,cid,level){
// 調用非同步請求方法
url = "。。。。。。。。";
sendAsynchronRequest(url,null,loadCallBack);
}
// 指定回調方法
function loadCallBack(){
try
{
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
if(xmlHttp.responseText != null && xmlHttp.responseText != ""){
var divProid = document.getElementById('videolist');
divProid.innerHTML = xmlHttp.responseText;
for(i=0;i<len;i++)
{
var video_url = document.getElementById("videolist"+i+"").href;
if(video_url != undefined && video_url != null && video_url != ""){
window.location.href = video_url;
}
}
}
}
}
if (xmlHttp.readyState == 1)
{
//alert("正在載入連接對象......");
}
if (xmlHttp.readyState == 2)
{
//alert("連接對象載入完畢。");
}
if (xmlHttp.readyState == 3)
{
//alert("數據獲取中......");
}
}
catch (e)
{
//alert(e);
}
}

⑧ 關於generator非同步編程的理解以及如何動手寫

關於generator非同步編程的理解以及如何動手寫一個co模塊

generator出現之前,想要實現對非同步隊列中任務的流程式控制制,大概有這么一下幾種方式:

⑨ 如何在一個類中實現非同步

開個線程池,為每個方法的執行分配一個線程,創建一個hashmap結果集,每個方法執行完,將其存入hashmap中,最後通過判斷hashmap的大小,判斷所有方法線程是否執行完畢,執行完畢則返回該hashmap。
非同步編程其實很常見,特別是在出線Node.js之後,非同步編程更是讓很多開發者受益。那麼回到最初的地方,傳統的前端開發中如何實現非同步編程呢?下面列舉了js實現非同步編程的四種方式。方法一:使用回調函數方法二:事件監聽可以定義一個事件,並為這個事件設定處理函數。這樣只有當這個時間發生的情況下,對應的處理函數才會被執行。方法三:事件的發布/訂閱這個模式在NodeJS以及其他JS框架中都有實現,是一個非常常用的非同步編程方式。
方法四:Promise模式ES6中提供了原生的Promise對象,這個模式最開始只是一個構想,後來由一些框架庫實現。Promise對象代表了未來才會知道結果的事件。Promise的基本思路就是,將需要非同步執行的事件儲存起來,然後根據非同步事件之行後的結果狀態執行下一步的操作。具體的Promise對象的原理和ES6中的使用方法將在下一篇文章中更加深入的進行介紹。
多線程實現。
過程如下
創建一下對象:
robot對象
avi保存對象
行走對象
在robot里使用多線程,2個線程就夠,1個執行avi保存對象,1個執行行走對象。
之所以要創建3個對象,主要是考慮到軟體工程的分而治之的思想。
另外如果你真是要製作機器人的話
可以做2個系統一個是運動控制系統,一個是avi存儲系統,系統間不互聯。這樣互相不會有干擾,而且容易實現,不會讓功能混亂。

⑩ 下面哪些方法可以用作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,如果草原上都是坑。

閱讀全文

與js非同步編程方式有哪些相關的資料

熱點內容
voc文件夾 瀏覽:862
租廣東聯通伺服器注意什麼雲空間 瀏覽:932
javascript高級程序設計pdf 瀏覽:289
pwm單片機原理 瀏覽:346
ai演算法在線修復圖片 瀏覽:979
scratch編程中如何做射擊游戲 瀏覽:476
at89c51編程器 瀏覽:341
項目經理叫醒程序員 瀏覽:342
autocad旋轉命令 瀏覽:660
手機版wpsoffice怎麼打包文件夾 瀏覽:579
在成都學車用什麼app 瀏覽:818
grep命令管道 瀏覽:426
java修改重啟 瀏覽:567
單片機供電方案 瀏覽:770
airpodspro一代怎麼連接安卓 瀏覽:218
豌豆莢app上有什麼游戲 瀏覽:285
公路商店app標簽選什麼 瀏覽:339
linuxoracle命令行登錄 瀏覽:227
android深度休眠 瀏覽:173
php微信開發例子 瀏覽:846