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

NodeJS如何實(shí)現(xiàn)同步的方法示例

 更新時間:2018年08月24日 10:05:16   作者:gsl222  
nodeJS最大的特點(diǎn)就是其異步操作,下面這篇文章主要給大家介紹了關(guān)于NodeJS如何實(shí)現(xiàn)同步的方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

眾所周知,異步是得天獨(dú)厚的特點(diǎn)和優(yōu)勢,但同時在程序中同步的需求(比如控制程序的執(zhí)行順序?yàn)椋篺unc1 -> func2 ->func3 )也是很常見的。

下面這篇文章主要介紹了關(guān)于NodeJS實(shí)現(xiàn)同步的相關(guān)內(nèi)容,NodeJS被打上了單線程、非阻塞、事件驅(qū)動…..等標(biāo)簽。 在單線程的情況下,是無法開啟子線程的。經(jīng)過了很久的研究,發(fā)現(xiàn)并沒有thread函數(shù)?。?!但是有時候,我們確實(shí)需要“多線程”處理事務(wù)。nodeJS有兩個很基礎(chǔ)的api:setTimeout和setInterval。這兩個函數(shù)都能實(shí)現(xiàn)“異步”。 nodeJS的異步實(shí)現(xiàn):nodeJS有一個任務(wù)隊列,在使用setInterval函數(shù)的時候,會每隔特定的時間向該任務(wù)隊列增加任務(wù),從而實(shí)現(xiàn)“多任務(wù)”處理。但是,“特定的時間”不代表是具體的時間,也有可能是會大于我們設(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是能實(shí)現(xiàn)多任務(wù)的效果,但是怎樣才能實(shí)現(xiàn)任務(wù)之間的同步操作呢?

這里實(shí)現(xiàn)的方法是通過回調(diào)函數(shù)實(shí)現(xiàn)的。

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

function b() {
 setTimeout(function() {
  console.log("task b end!");
 }, 5000);
}
a(b);

這里舉了一個很簡單的例子,就是將b方法的實(shí)現(xiàn)賦值給a方法的callback函數(shù)從而實(shí)現(xiàn)函數(shù)回調(diào),但是會有個問題。假設(shè)a方法依賴于b方法,b方法依賴于c方法,c方法依賴于d方法…..也就意味著每個方法的實(shí)現(xiàn)都需要持有上一個方法的實(shí)例,從而實(shí)現(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ù)能讓任務(wù)順序執(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模塊的實(shí)現(xiàn)的如果了解更多關(guān)于async模塊的使用,可以點(diǎn)擊:查看詳情

其實(shí)nodeJS基本api也提供了異步實(shí)現(xiàn)同步的方式。基于Promise+then的實(shí)現(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有可能能實(shí)現(xiàn)我們異步任務(wù)同步執(zhí)行的功能。我們先用Promise+then結(jié)合起來實(shí)現(xiàn)異步任務(wù)同步操作。

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Windows中徹底刪除Node.js環(huán)境(以及npm)的方法

    Windows中徹底刪除Node.js環(huán)境(以及npm)的方法

    本文詳細(xì)介紹了如何在Windows電腦中徹底刪除Node.js環(huán)境,包括查找安裝路徑、使用控制面板卸載以及手動刪除殘留文件夾
    2025-01-01
  • 使用Node.js處理前端代碼文件的編碼問題

    使用Node.js處理前端代碼文件的編碼問題

    這篇文章主要介紹了使用Node.js處理前端代碼文件的編碼問題的方法,Node自帶的相關(guān)類庫處理編碼方面的問題時還是比較得心應(yīng)手的,需要的朋友可以參考下
    2016-02-02
  • 我的Node.js學(xué)習(xí)之路(一)

    我的Node.js學(xué)習(xí)之路(一)

    這是一篇專門Node.js初學(xué)者學(xué)習(xí)筆記。該筆記將通過具體實(shí)例,教你一步步開始Node.js之旅。
    2014-07-07
  • node.js適合游戲后臺開發(fā)嗎?

    node.js適合游戲后臺開發(fā)嗎?

    這篇文章主要介紹了node.js適合游戲后臺開發(fā)嗎?node.js是不是能代替C++開發(fā)游戲后臺呢?看完本文我想你會有一定的了解了,需要的朋友可以參考下
    2014-09-09
  • node.js中的path.basename方法使用說明

    node.js中的path.basename方法使用說明

    這篇文章主要介紹了node.js中的path.basename方法使用說明,本文介紹了path.basename的方法說明、語法、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • node.js中的fs.fchown方法使用說明

    node.js中的fs.fchown方法使用說明

    這篇文章主要介紹了node.js中的fs.fchown方法使用說明,本文介紹了fs.fchown方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 如何讓Nodejs支持H5 History模式(connect-history-api-fallback源碼分析)

    如何讓Nodejs支持H5 History模式(connect-history-api-fallback源碼分析)

    這篇文章主要介紹了如何讓Nodejs支持H5 History模式(connect-history-api-fallback源碼分析),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • Node.js基礎(chǔ)入門之回調(diào)函數(shù)及異步與同步詳解

    Node.js基礎(chǔ)入門之回調(diào)函數(shù)及異步與同步詳解

    Node.js是一個基于Chrome?V8引擎的JavaScript運(yùn)行時。類似于Java中的JRE,.Net中的CLR。本文將詳細(xì)為大家介紹Node.js中的回調(diào)函數(shù)及異步與同步,感興趣的可以了解一下
    2022-03-03
  • 什么時候不能在 Node.js 中使用 Lock Files

    什么時候不能在 Node.js 中使用 Lock Files

    這篇文章主要介紹了什么時候不能在 Node.js 中使用 Lock Files,但是當(dāng)你在開發(fā)要發(fā)布到 npm 的包時,應(yīng)避免使用這類 lock file 。下面我們來一起了解一下吧
    2019-06-06
  • node中的session的具體使用

    node中的session的具體使用

    這篇文章主要介紹了node中的session的具體使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09

最新評論

西宁市| 延安市| 临沂市| 界首市| 河津市| 左贡县| 石首市| 灵石县| 阳曲县| 绿春县| 鄂尔多斯市| 东平县| 晋城| 西华县| 象山县| 元谋县| 板桥市| 新泰市| 高青县| 桐梓县| 临江市| 绥德县| 阳朔县| 晋中市| 宣汉县| 平顺县| 堆龙德庆县| 海盐县| 开阳县| 伊春市| 溆浦县| 北碚区| 临泉县| 贵港市| 连州市| 古田县| 天全县| 来凤县| 紫金县| 奉节县| 建湖县|