最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

NodeJS實現(xiàn)同步的方法

 更新時間:2019年03月02日 10:30:18   作者:new_Aiden  
今天小編就為大家分享一篇關(guān)于NodeJS實現(xiàn)同步的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

NodeJS被打上了單線程、非阻塞、事件驅(qū)動…..等標簽。

在單線程的情況下,是無法開啟子線程的。經(jīng)過了很久的研究,發(fā)現(xiàn)并沒有thread函數(shù)!??!但是有時候,我們確實需要“多線程”處理事務。nodeJS有兩個很基礎(chǔ)的api:setTimeout和setInterval。這兩個函數(shù)都能實現(xiàn)“異步”。

nodeJS的異步實現(xiàn):nodeJS有一個任務隊列,在使用setInterval函數(shù)的時候,會每隔特定的時間向該任務隊列增加任務,從而實現(xiàn)“多任務”處理。但是,“特定的時間”不代表是具體的時間,也有可能是會大于我們設(shè)定的時間,也有可能小于。

我們跑跑下面代碼塊

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

輸出的結(jié)果如下:

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

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

問題來了,setInterval是能實現(xiàn)多任務的效果,但是怎樣才能實現(xiàn)任務之間的同步操作呢?這里實現(xiàn)的方法是通過回調(diào)函數(shù)實現(xiàn)的。

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

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

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);

輸出結(jié)果

hello a
hello b
hello c
hello d

如果回調(diào)函數(shù)寫的多了,會造成代碼特別特別惡心。

如果有類似于sync的函數(shù)能讓任務順序執(zhí)行就更好了。終于找到了async這個庫

$ npm instanll async

async = require("async");
a = function (callback) {
  // 延遲5s模擬耗時操作
  setTimeout(function () {
    console.log("hello world a");
    // 回調(diào)給下一個函數(shù)
    callback(null, "function a");
  }, 5000);
};
b = function (callback) {
  // 延遲1s模擬耗時操作
  setTimeout(function () {
    console.log("hello world b");
    // 回調(diào)給下一個函數(shù)
    callback(null, "function b");
  }, 1000);
};
c = function (callback) {
  console.log("hello world c");
  // 回調(diào)給下一個函數(shù)
  callback(null, "function c");
};
// 根據(jù)b, a, c這樣的順序執(zhí)行
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模塊的實現(xiàn)的如果了解更多關(guān)于async模塊的使用,可以查詢官方文檔

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

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

輸出結(jié)果為:

Promise { <pending> }
end!

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

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));

輸出結(jié)果:

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

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

不過,還有更加優(yōu)雅的方式:使用async+await。

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

輸出結(jié)果:

b
a
c

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

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • ubuntu下安裝nodejs以及升級的辦法

    ubuntu下安裝nodejs以及升級的辦法

    本文介紹了ubuntu 12.04服務器安裝nodejs以及升級的方法,ubuntu安裝nodejs以及升級的實例教程,需要的朋友參考下。
    2015-05-05
  • nodejs部署到騰訊云服務器的實現(xiàn)(寶塔面板linux系統(tǒng))

    nodejs部署到騰訊云服務器的實現(xiàn)(寶塔面板linux系統(tǒng))

    本文主要介紹了nodejs部署到騰訊云服務器的實現(xiàn)(寶塔面板linux系統(tǒng)),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 解析NodeJS異步I/O的實現(xiàn)

    解析NodeJS異步I/O的實現(xiàn)

    本篇文章主要介紹了解析NodeJS異步I/O的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • nodejs實現(xiàn)一個自定義的require方法的詳細流程

    nodejs實現(xiàn)一個自定義的require方法的詳細流程

    大家對nodejs中的require方法應該不會陌生,這個方法可以用來導入nodejs的內(nèi)置模塊,自定義模塊,第三方模塊等,使用頻率非常高,那么這個方法內(nèi)部是如何實現(xiàn)的呢?本篇文章就是從頭到尾拆分實現(xiàn)流程,最終實現(xiàn)一個自定義的require方法,需要的朋友可以參考下
    2025-03-03
  • 詳解nodejs 文本操作模塊-fs模塊(五)

    詳解nodejs 文本操作模塊-fs模塊(五)

    本篇文章主要介紹了nodejs 文本操作模塊-fs模塊(五),這里再說最后一個我看來很重要的方法,監(jiān)聽文件或者目錄的的方法watchFile。有興趣的可以了解一下。
    2016-12-12
  • 基于Node.js + WebSocket打造即時聊天程序嗨聊

    基于Node.js + WebSocket打造即時聊天程序嗨聊

    這篇文章主要介紹了基于Node.js + WebSocket打造即時聊天程序,有興趣的可以了解一下。
    2016-11-11
  • Nodejs獲取網(wǎng)絡數(shù)據(jù)并生成Excel表格

    Nodejs獲取網(wǎng)絡數(shù)據(jù)并生成Excel表格

    這篇文章主要為大家詳細介紹了Nodejs獲取網(wǎng)絡數(shù)據(jù)并生成Excel表格的具體實現(xiàn)方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Nodejs之TCP服務端與客戶端聊天程序詳解

    Nodejs之TCP服務端與客戶端聊天程序詳解

    這篇文章主要為大家詳細介紹了Nodejs之TCP服務端與客戶端聊天程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Node.js 的異步 IO 性能探討

    Node.js 的異步 IO 性能探討

    Node.js 的賣點是「異步單線程」,雖然主流 Web 后端編程語言中,對異步編程有很好支持的語言并不少,但只有 Node.js 喪心病狂地將所有 IO 強制異步進行。
    2014-10-10
  • 詳解如何使用Node.js實現(xiàn)熱重載頁面

    詳解如何使用Node.js實現(xiàn)熱重載頁面

    這篇文章主要介紹了詳解如何使用Node.js實現(xiàn)熱重載頁面,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05

最新評論

西充县| 分宜县| 永寿县| 建水县| 宁海县| 普兰县| 曲阜市| 舒城县| 霍城县| 青铜峡市| 友谊县| 上栗县| 霞浦县| 贵定县| 布拖县| 临高县| 两当县| 巩义市| 柳林县| 新宁县| 城步| 额敏县| 新丰县| 平邑县| 芮城县| 临夏县| 岱山县| 峨山| 荣成市| 山阴县| 白河县| 北辰区| 昆山市| 文山县| 平远县| 孝义市| 金坛市| 文成县| 焉耆| 宁河县| 县级市|