亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

NodeJS如何實現同步的方法示例

2024-05-06 16:45:50
字體:
來源:轉載
供稿:網友

前言

眾所周知,異步是得天獨厚的特點和優勢,但同時在程序中同步的需求(比如控制程序的執行順序為:func1 -> func2 ->func3 )也是很常見的。

下面這篇文章主要介紹了關于NodeJS實現同步的相關內容,NodeJS被打上了單線程、非阻塞、事件驅動…..等標簽。 在單線程的情況下,是無法開啟子線程的。經過了很久的研究,發現并沒有thread函數?。?!但是有時候,我們確實需要“多線程”處理事務。nodeJS有兩個很基礎的api:setTimeout和setInterval。這兩個函數都能實現“異步”。 nodeJS的異步實現:nodeJS有一個任務隊列,在使用setInterval函數的時候,會每隔特定的時間向該任務隊列增加任務,從而實現“多任務”處理。但是,“特定的時間”不代表是具體的時間,也有可能是會大于我們設定的時間,也有可能小于。

我們跑跑下面代碼塊

setInterval(function() { console.log(new Date().getTime());}, 1000);

輸出的結果如下:

1490531390640
1490531391654
1490531392660
1490531393665
1490531394670
1490531395670
1490531396672
1490531397675
......

我們可以看到,所有的時間間隔都是不一樣的。時間的偏移不僅包含了間隔的1s,還包含了console.log()的耗時,以及new Date()的耗時。在大量的數據統計下,時間間隔近似于1s。

問題來了,setInterval是能實現多任務的效果,但是怎樣才能實現任務之間的同步操作呢?

這里實現的方法是通過回調函數實現的。

function a(callback) { // 模擬任務a耗時 setTimeout(function() {  console.log("task a end!");  // 回調任務b  callback(); }, 3000);};function b() { setTimeout(function() {  console.log("task b end!"); }, 5000);}a(b);

這里舉了一個很簡單的例子,就是將b方法的實現賦值給a方法的callback函數從而實現函數回調,但是會有個問題。假設a方法依賴于b方法,b方法依賴于c方法,c方法依賴于d方法…..也就意味著每個方法的實現都需要持有上一個方法的實例,從而實現回調。

function a(b, c, d) { console.log("hello a"); b(c, d);};function b(c, d) { console.log("hello b"); c(d);};function c(d) { console.log("hello c"); d()};function d() { console.log("hello d");};a(b, c, d);

輸出結果

hello a
hello b
hello c
hello d

如果回調函數寫的多了,會造成代碼特別特別惡心。

如果有類似于sync的函數能讓任務順序執行就更好了。終于找到了async這個庫 $ npm instanll async

async = require("async");a = function (callback) { // 延遲5s模擬耗時操作 setTimeout(function () {  console.log("hello world a");  // 回調給下一個函數  callback(null, "function a"); }, 5000);};b = function (callback) { // 延遲1s模擬耗時操作 setTimeout(function () {  console.log("hello world b");  // 回調給下一個函數  callback(null, "function b"); }, 1000);};c = function (callback) { console.log("hello world c"); // 回調給下一個函數 callback(null, "function c");};// 根據b, a, c這樣的順序執行async.series([b, a, c], function (error, result) { console.log(result);});

注釋基本能夠很好的理解了,我們看看輸出

hello world b
hello world a
hello world c
[ 'function b', 'function a', 'function c' ]

上面的基本async模塊的實現的如果了解更多關于async模塊的使用,可以點擊:查看詳情

其實nodeJS基本api也提供了異步實現同步的方式?;赑romise+then的實現

sleep = function (time) { return new Promise(function () {  setTimeout(function () {   console.log("end!");  }, time); });};console.log(sleep(3000));

輸出結果為:

Promise { <pending> }
end!

可以看出來,這里返回了Promise對象,直接輸出Promise對象的時候,會輸出該對象的狀態,只有三種:PENDING、FULFILLED、REJECTED。字面意思很好理解。也就是說Promise有可能能實現我們異步任務同步執行的功能。我們先用Promise+then結合起來實現異步任務同步操作。

sleep = function () { return new Promise(function (resolve, reject) {  setTimeout(function () {   console.log("start!");   resolve();  }, 1000); })  .then(function () {   setTimeout(function () {    console.log("end!");   }, 2000);  })  .then(function () {   console.log("end!!");  })};console.log(sleep(1000));

輸出結果:

Promise { <pending> }
start!
end!!
end!

在new Promise任務執行完后,調用了resolve才會執行所有的then函數,并且這些then函數是異步執行的。由輸出結果可以知道。(如果所有then是順序執行的應該是end! -> end!!)。但是上述也做到了兩個異步任務之間順序執行了。

不過,還有更加優雅的方式:使用async+await。

display = function(time, string) { return new Promise(function (resovle, reject) {  setTimeout(function () {   console.log(string);   resovle();  }, time) });};// 執行順序:b a cfn = async function () { // 會造成阻塞 await display(5000, "b"); await display(3000, "a"); await display(5000, "c");}();

輸出結果:

b
a
c

由于這里時間輸出比較尷尬,只能通過我們來感知,本人通過個人“感知”知道了在display b過度到display a的時候大概用了3s,再過度到display c的時候大概用了5s

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩有码在线电影| 欧美猛交ⅹxxx乱大交视频| 欧美在线视频播放| 欧美激情中文字幕在线| 国产精品成人av在线| 欧美精品制服第一页| 中日韩美女免费视频网址在线观看| 欧美电影在线观看完整版| 久久综合色88| 欧美精品www在线观看| 亚洲色图25p| 欧美日韩精品二区| 欧美xxxx14xxxxx性爽| 欧美日韩福利在线观看| 国产aⅴ夜夜欢一区二区三区| 亚洲国产精品久久久| 伊人男人综合视频网| 欧美精品成人在线| 国产精品普通话| 国内精品中文字幕| 国产一区二区三区毛片| 欧美激情a在线| 色综合天天综合网国产成人网| 黑人巨大精品欧美一区免费视频| 欧美老女人xx| 色播久久人人爽人人爽人人片视av| 欧美精品久久久久久久免费观看| 国产精品99久久久久久人| 欧美日韩国产中文字幕| 久久久久久久久久久久久久久久久久av| 国产精品成人一区| 亚洲精品电影网在线观看| 欧美精品www| 91精品国产综合久久男男| 亚洲跨种族黑人xxx| 正在播放欧美一区| 亚洲一级黄色片| 欧美性猛交xxxx| 亚洲激情成人网| 日韩精品亚洲视频| 欧美床上激情在线观看| 亚洲成在人线av| 亚洲视频视频在线| 成人h视频在线| 欧美激情网友自拍| 欧美不卡视频一区发布| 美女性感视频久久久| 青青久久av北条麻妃海外网| 国产精品第3页| 亚洲精品视频久久| 亚洲欧美日韩一区二区三区在线| 中文字幕日韩精品在线| 日韩中文在线视频| 欧美日韩中文字幕在线| 美女精品视频一区| 91成品人片a无限观看| 欧美成人激情视频免费观看| 久久久999精品视频| 国产精品丝袜久久久久久不卡| 亚洲乱亚洲乱妇无码| 国产欧美一区二区三区四区| 成人黄色午夜影院| 日韩精品视频免费专区在线播放| 国产精品免费观看在线| 亚洲欧美在线第一页| 中文字幕自拍vr一区二区三区| 97av视频在线| 亚洲精品福利在线观看| 在线一区二区日韩| 久久久久一本一区二区青青蜜月| 欧美激情性做爰免费视频| 久久天天躁狠狠躁老女人| 日韩av片电影专区| 在线视频欧美日韩| 亚洲天堂av女优| 狠狠躁18三区二区一区| 国产精品永久在线| 国产小视频91| 日韩在线观看你懂的| 神马久久桃色视频| 日韩电影在线观看免费| 日韩经典第一页| 日韩69视频在线观看| 日本伊人精品一区二区三区介绍| 91久久久久久久久久| 日韩中文字幕在线播放| 久久精品视频一| 久久人人爽人人爽爽久久| 色久欧美在线视频观看| 国产精品青青在线观看爽香蕉| 97精品一区二区三区| 久久久久久12| 欧美成人黑人xx视频免费观看| 亚洲xxxxx| 国产精品一区久久久| 亚洲欧洲在线播放| 欧美激情精品久久久久久黑人| 亚洲国产精品va在线看黑人| 亚洲欧美日韩视频一区| 日韩av理论片| 欧美午夜女人视频在线| 欧美电影《睫毛膏》| 亚洲天堂久久av| 欧美大片免费观看| 国产精品国产福利国产秒拍| 国产丝袜一区视频在线观看| 欧美精品电影在线| 中文字幕亚洲综合久久筱田步美| 亚洲精品网站在线播放gif| 欧美精品制服第一页| 午夜精品福利电影| 性色av香蕉一区二区| 久久精品久久久久久国产 免费| 亚洲天天在线日亚洲洲精| 国产mv久久久| 成人做爰www免费看视频网站| 久久久久久久久久久人体| 精品在线观看国产| 国产精品视频区1| 欧美电影在线观看网站| 97人洗澡人人免费公开视频碰碰碰| 国产a∨精品一区二区三区不卡| 国产精品爽黄69天堂a| 欧洲亚洲免费在线| 日韩一区二区久久久| 成人黄色av播放免费| 欧美日韩国产在线看| 国内精品在线一区| 欧美一区视频在线| 91亚洲精品在线| 亚洲精品成人久久久| 国产精品入口夜色视频大尺度| 亚洲美女性视频| 日韩欧美精品网址| 日韩免费在线视频| 久久久国产精品x99av| 亚洲一区二区中文| 欧美另类xxx| 国产999精品久久久| 国产成人一区二区| 国产日韩欧美在线看| 亚洲精品国产美女| 国产成人鲁鲁免费视频a| 国产精品海角社区在线观看| 精品国产欧美成人夜夜嗨| 欧美视频在线免费看| 国产欧美精品xxxx另类| 欧美伦理91i| 日韩在线欧美在线国产在线| 久久91亚洲人成电影网站| 亚洲精品视频在线播放| 国产成人综合一区二区三区| 久久久精品中文字幕| 一区二区三区国产视频| 色在人av网站天堂精品| 91久久久久久久久久久| 国产精品久久久久久久久久三级| 午夜精品一区二区三区在线播放| 欧美激情一区二区三区高清视频| 日韩毛片在线看| 91久久精品国产91久久性色| 日韩黄色在线免费观看| 精品国产福利在线| 久久亚洲综合国产精品99麻豆精品福利|