① 如何進行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出現之前,想要實現對非同步隊列中任務的流程式控制制,大概有這么一下幾種方式:
回調函數
事件監聽
發布/訂閱
promise對象
第一種方式想必大家是最常見的,其代碼組織方式如下:
我們把函數放到run的執行器裡面,便實現了同步操作非同步代碼的過程
⑨ 如何在一個類中實現非同步
開個線程池,為每個方法的執行分配一個線程,創建一個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,如果草原上都是坑。