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

首頁 > 開發 > JS > 正文

NodeJS實現同步的方法

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

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

這里需要聲明的是:才開始正式的學習nodeJS。在學習的過程中,做的筆記,很多概念與理解可能會錯誤,如果錯誤,歡迎糾正。

總結

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美极品美女电影一区| 亚洲成av人影院在线观看| 91亚洲人电影| 91精品在线看| 亚洲精品日韩丝袜精品| 国产精品69av| 亲爱的老师9免费观看全集电视剧| 疯狂做受xxxx欧美肥白少妇| 久久99青青精品免费观看| 2020欧美日韩在线视频| 综合网日日天干夜夜久久| 欧美做受高潮1| 色777狠狠综合秋免鲁丝| 国产精品色婷婷视频| 中文字幕欧美国内| 亚洲第一精品久久忘忧草社区| 国产精品96久久久久久又黄又硬| 91性高湖久久久久久久久_久久99| 国产99久久精品一区二区| 九九精品在线观看| 国产69精品久久久久9999| 搡老女人一区二区三区视频tv| 另类美女黄大片| 亚洲一区二区三区香蕉| 久久免费福利视频| 欧美黑人xxx| 亚洲电影天堂av| 欧美日韩一区二区免费视频| 国产精品永久免费观看| 成人激情视频在线播放| 一区二区三区动漫| 国产成+人+综合+亚洲欧洲| 免费不卡欧美自拍视频| 亚洲精品国产精品国自产在线| 日韩精品久久久久久久玫瑰园| 国产精品igao视频| 国产成人精品午夜| 欧美精品电影在线| 国产69精品久久久久99| 亚洲国产精彩中文乱码av在线播放| 亚洲国产精品va在线看黑人| 91高清在线免费观看| 中文精品99久久国产香蕉| 国产午夜精品视频免费不卡69堂| 欧美激情视频给我| 97精品久久久| 久久综合伊人77777| 欧美日本中文字幕| 久久久精品国产亚洲| 日韩三级成人av网| 91精品国产高清| 国产亚洲精品美女久久久久| 国产精品第8页| 国产精品福利片| 欧美wwwwww| 日韩在线观看高清| 日韩av免费看| 亚洲欧美一区二区激情| 精品女同一区二区三区在线播放| www.亚洲成人| 欧美色欧美亚洲高清在线视频| 成人福利网站在线观看| 欧美寡妇偷汉性猛交| 日本久久久a级免费| 久久久www成人免费精品| 久久久久久久久久久国产| 欧美精品video| 久久亚洲精品一区| 国产在线视频欧美| 色妞欧美日韩在线| 久久精品中文字幕免费mv| 亚洲最大在线视频| 成人免费视频网| 成年人精品视频| 最近2019中文字幕一页二页| 亚洲日本aⅴ片在线观看香蕉| 欧美性开放视频| 狠狠躁夜夜躁人人爽天天天天97| 国产精品一香蕉国产线看观看| 日韩大陆毛片av| 91久久国产综合久久91精品网站| 日韩电影中文 亚洲精品乱码| 欧美猛少妇色xxxxx| 国产精品国产自产拍高清av水多| 国产精品一区av| 亚洲精品久久久久久下一站| 亚洲黄色av网站| 91久久精品久久国产性色也91| 国产在线精品播放| 91av在线播放| 亚洲成人激情在线观看| 亚洲人成在线播放| 美女撒尿一区二区三区| 2021久久精品国产99国产精品| 91精品国产自产在线| 一区二区在线免费视频| 国产精品亚洲视频在线观看| 欧美日韩一区二区三区在线免费观看| 国产精品白嫩初高中害羞小美女| 国产男女猛烈无遮挡91| 亚洲性日韩精品一区二区| 久久天天躁狠狠躁夜夜av| 久久国产精品久久国产精品| 国产精品人人做人人爽| 精品国产区一区二区三区在线观看| 亚洲国产三级网| 欧美尤物巨大精品爽| 国产精品成人va在线观看| 成人精品久久一区二区三区| 日韩麻豆第一页| 午夜免费在线观看精品视频| 色婷婷综合久久久久| 国内精品一区二区三区| 久久久久久久久国产精品| 日韩精品在线视频| 青青草国产精品一区二区| 久久亚洲私人国产精品va| 国产999在线| 91sao在线观看国产| 在线性视频日韩欧美| 国产成+人+综合+亚洲欧美丁香花| 日韩在线一区二区三区免费视频| 亚洲国产精品久久久久秋霞不卡| 亚洲一区二区福利| 最近2019中文免费高清视频观看www99| 日韩中文字幕网站| 欧美日韩在线第一页| 黑人巨大精品欧美一区二区一视频| 97在线视频免费观看| 久久久久一本一区二区青青蜜月| 亚洲综合成人婷婷小说| www国产精品视频| 国产精品自拍偷拍视频| 91日韩在线播放| 日韩av一区二区在线观看| 成人午夜在线视频一区| 97精品免费视频| …久久精品99久久香蕉国产| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品18久久久久久首页狼| 国产精品海角社区在线观看| 国内精品久久久久影院 日本资源| 欧美午夜精品久久久久久久| 精品中文字幕在线| 亚洲久久久久久久久久久| 日韩视频精品在线| 久久色免费在线视频| 国产v综合v亚洲欧美久久| 日韩欧美视频一区二区三区| 中文字幕亚洲国产| 成人日韩在线电影| 成人h视频在线观看播放| 国产视频观看一区| 久久精品人人做人人爽| 欧美中文字幕精品| 欧美电影免费观看| 97视频在线观看播放| 久久综合伊人77777蜜臀| 久久99国产精品自在自在app| 91精品91久久久久久| 亚洲国产精品热久久| 91视频免费在线| 欧美激情亚洲精品| 欧美成人免费大片|