1. 程式人生 > >Node.js async特殊示例,加深理解。

Node.js async特殊示例,加深理解。

//mo.postRequest.js
async function postRequest(x) {
    return new Promise(function (resolve, reject) {
        try{
            if(x == 10){
                resolve(x);
            }
            else{
                console.log(x);
                x = x+1;
                reject(x);
            }
        }
        catch
(e){ console.log(e) } }).then(null,function(err){ postRequest(x); }); } module.exports = postRequest;
//index.js
var mo = require('./mo.postRequest.js')
async function hand(callback) {
    try {
        await mo(1).then(function(value){
            console.log('succ:'
+value) },function(err){ console.log('fail:'+err) }) callback(); } catch (e) { console.log('err:'+e) } } hand(function () { console.log('我是callback'); }) console.log('看看hand有沒有正常執行');
1                       mo.postRequest.js:8
看看hand有沒有正常執行       index.js
:18 2 mo.postRequest.js:8 3 mo.postRequest.js:8 4 mo.postRequest.js:8 succ:undefined index.js:5 5 mo.postRequest.js:8 6 mo.postRequest.js:8 我是callback index.js:15 7 mo.postRequest.js:8 8 mo.postRequest.js:8 9 mo.postRequest.js:8

這段程式碼是有毛病的,說實話,我也不知道能用它幹嘛。
剛開始想用 非同步做出來一個 類似遞迴的呼叫,直到x=10 再輸出。
輸出後的結果,反而看不懂了。

但是仔細分析後,發現其實程式碼執行起來並不是想象的那樣。

我是callback,和 看看hand有沒有正常執行 看起來
最外層非同步的順序,確實是正確的。hand被當做一個非同步函式,在hand執行一次之後,沒有讓後面的程式碼進行等待。

那麼succ:undefined 是什麼情況?它的前後都應該是錯誤啊?難道是mo模組裡面的then把錯誤吃掉了?
另外要注意下succ只執行了一次。一個非同步完成以後,執行了後面then。輸出了succ。
所以非同步裡面的東西,可以看做與then無關,除了promise傳遞的引數。
這也是為什麼 我是callback 看上去會在 9之前輸出。

async function postRequest(x) {
    return new Promise(function (resolve, reject) {
        try {
            if (x == 10) {
                resolve(x);
            }
            else {
                // console.log(x);
                x = x + 1;
                reject(x);
            }
        }
        catch (e) {
            // console.log(e)
        }
    })
        .then(function (a) { }, function (err) { console.log(err); })
        .then(function (a) { var x = 1; console.log(x); }, function (err) { console.log(err); })
}
module.exports = postRequest;

把遞迴的部分去掉,然後放上兩個then,看看後面一個then,會不會輸出錯誤。

看看hand有沒有正常執行
2// 這裡是第一個then輸出的錯誤,後面沒有錯誤了,應該是被它吃了。
1//但是這裡輸出了第二個then 的onfilled ,onreject部分沒有執行。
succ:undefined
我是callback

錯誤是被吃掉了吧。。。哈哈哈。
然後 會發現,後面的then其實是執行了的。比如在裡面放上console.log之類的,就能看到效果了。
所以不要在then後面做需要授權的操作吧。
不放心。

function fun(x) {
    return new Promise(function (resolve, reject) {
        setTimeout(() => {
            x=x+1;
            console.log(x);
            resolve(x);
        }, 1000);
    })
}

function fun2() {
    return new Promise(function (resolve, reject) {
        setTimeout(() => {
            x=x+1;
            console.log(x);
            resolve(x);
        }, 1000);
    })
}

function fun3(){
    return new Promise(function (resolve, reject) {
        setTimeout(() => {
            x=x+1;
            console.log(x);
            resolve(x);
        }, 1000);
    })
}
function fun4(){
    return new Promise(function (resolve, reject) {
        setTimeout(() => {
            x=x+1;
            console.log(x);
            resolve(x);
        }, 1000);
    })
}


var x = 0;
fun(x).then(fun2).then(fun3).then(fun4)

輸出

1
1
2
3

注意第一個函式有一個引數。其他的函式沒有。
斷點顯示,第一次執行的x,似乎沒有變化。

但是 如果將 fun改為

function fun(a) {
    return new Promise(function (resolve, reject) {
        setTimeout(() => {
            a=a+1;
            console.log(a);
            resolve(a);
        }, 1000);
    })
}

將傳入的引數 x 改為 a;結果依舊不變。似乎我忽略了中間的什麼。

var a = 0;
function fun5(a){
    setTimeout(() => {
        a=a+1;
        console.log(a);
    }, 1000);
}
setTimeout(() => {
    console.log(a);
}, 2000);
fun5(a);

使用此程式碼測試
結果為

1
0

再測試

var a = 0;
function fun6(a){
    a=a+1;
    console.log(a);
}
setTimeout(() => {
    console.log(a);
}, 2000);
fun6(a);

結果和上面一樣
我現在有點懵了。
~~js不是值傳遞?a不是number?我得去找找資料了。~~
這裡找到一篇資料
明顯和我測試結果不一樣。我還是很懵逼。
~~我要去求助了。~~
論壇寫到一半,想起來是值傳遞。。。簡直是傻。。。

相關推薦

Node.js async特殊示例加深理解

//mo.postRequest.js async function postRequest(x) { return new Promise(function (resolve, reject) { try{ if

方便大家學習的Node.js教程(一):理解Node.js

圖形 -1 iter pri attribute set run 相對 mage 理解Node.js 為了理解Node.js是如何工作的,首先你需要理解一些使得Javascript適用於服務器端開發的關鍵特性。Javascript是一門簡單而又靈活的語言,這種靈

深入淺出Node.js--數據通訊NET模塊運行機制

end lose exp 事件驅動 如何 方式 基本 html 定義 互聯網的運作,最根本的驅動就是信息的交互,NodeJS 在數據交互這一塊做的很帶感,異步編程讓人很愜意,關於 NodeJS 的數據通信,最基礎的兩個模塊是 NET 和 HTTP,前者是基於 TCP 的封裝

node.js (感覺很好雖轉載一留後用)

關於node.js Node.js 是伺服器端的 JavaScript 執行環境,它具有無阻塞(non-blocking)和事件驅動(event-driven)等的特色,Node.js 採用V8引擎,同樣,Node.js實現了類似 Apache 和 nginx 的web服務,讓你可以通過它來搭

Node.js學習隨筆三事件event

Node.js 是單程序單執行緒應用程式,但是因為 V8 引擎提供的非同步執行回撥介面,通過這些介面可以處理大量的併發,所以效能非常高。 Node.js 幾乎每一個 API 都是支援回撥函式的。 Node.js 基本上所有的事件機制都是用設計模式中觀察者模式實現。 Node.js 單執行緒類似進入一個w

你不知道的Node.js性能優化讀了之後水平直線上升

fail 組類型 frame 繼續 同時 all dstream 引擎 perf 本文由雲+社區發表 “當我第一次知道要這篇文章的時候,其實我是拒絕的,因為我覺得,你不能叫我寫馬上就寫,我要有幹貨才行,寫一些老生常談的然後加上好多特技,那個 Node.js 性能啊好像 Du

02-node.js 單執行緒‘ 非同步’非阻塞io

1、基本概念     同步:多個任務順序執行     非同步:多個任務並排執行 2、node的併發實現原理     Node JS是單執行緒應用程式,但它通過事件和回撥概念,支援併發。 由於Node JS每一個API是非同步的,作為一個單獨的執行緒,它使用非同步函

node.js檔案的複製建立資料夾等相關操作

nodeJS對檔案的複製: 一般對於小型檔案的複製操作使用的是流的管道運輸操作, 首先需要載入引入的檔案:var fs = require('fs'); 1、同步建立資料夾 fs.mkdirSync(yourfileDirPath); 非同步建立資

Hyperledger fabric Client Node.js Hello World示例程式

簡介 Hyperledger fabric Client (HFC)提供了基於Node.js的應用介面來訪問Hyperledger區塊. 本文介紹了一個使用HFC訪問IBM Bluemixr區塊服務的Hello World示例程式的開發過程. 第一步 安裝HFC 在工作目錄下執行如下npm命令從安裝HFC,

node.js async/await~刪除檔案的例子

1)像同步寫法一樣批量刪除檔案 var util = require("util"); var fs = require("fs"); var unlink = util.promisify(fs.unlink); async function f(fileNameArr) { f

node.js async實踐分享

nodejs是基於事件驅動的,所有的一切都是非同步呼叫的,這種實現機制優點確實十分明顯,那就是避免了同步呼叫的無盡等待。一直以來,node.js用著都是比較令人感覺興奮的,直到有一天,我陷入了它埋藏的無盡的回撥深坑中,讓我內牛滿面。 記得那是一個秋天,大約在冬季,我在我的程式碼小王國裡做一件小事

Node.JS Express渲染HTML變成顯示原始碼 問題及解決

Node.JS渲染HTML變成顯示原始碼問題及解決 問題 當使用Node.JS Express伺服器渲染HTML頁面的時候,本應該渲染出HTML頁面,結果顯示出了HTML的原始碼: HTML EJS引擎渲染 在生成的express工程中,預設使用

Node.js、以及npm的個人理解

Node.js是什麼? 官方概念:Node.js 是一個基於 Chrome V8 引擎的 JavaScript 執行環境,能夠使得javascript脫離瀏覽器執行。 使用js寫伺服器的優點: 1. 事件驅動 2. 非阻塞式I/O (解決一般伺服器,在高

node.js的反向代理解決瀏覽器的跨域問題

一、背景        在實際專案中,因為我們大家都不是獨立開發,而是和很多人一起合作。所以在開發階段的時候,經常要呼叫別人的介面,這就自然產生了跨域問題。我目前已知的方法是谷歌瀏覽器可以解決跨域問題,在實際專案中我也是這麼操作的,但是這樣很麻煩,所以就用了下面這個方法,可以

又論Node.js的HTTP模組之深入理解

問題1:HTTP服務繼承了TCP服務模型,是從connection為單位的服務到以request為單位的服務的封裝,那麼request事件何時觸發? 注意:在開啟keepalive後,一個TCP會話可以用於多次請求和響應,在請求產生的過程中,http模組拿到傳遞過來的資料,

Node.js操作redis示例及常用命令彙總

<p style="margin-top: 0px; margin-bottom: 1.1em; padding-top: 0px; padding-bottom: 0px; box-sizing: border-box; color: rgb(54, 46, 43)

node.js——async同步非同步

程式碼是最好的語言,如下所示: var async=require('./async'); //同步無關聯 function series(){ async.series({ 'ma':fun

js 設定時間戳進行倒計時比如距離活動結束時間等等

<html> <head> <meta charset="UTF-8"> <title>js簡單時分秒倒計時</title> <script type="text/javascript"&g

TP5雙表聯查示例入門必備

有許多新人不會聯查兩張表,這裡就詳細解說一哈tp5中雙表聯查是如何寫的   首先你需要2張表,那就是admin表和index表吧。 其次需要2張表有欄位關聯,比如說admin表中的id欄位,與index表中的aid欄位(欄位名稱自己定義,這裡只是舉例子) 要在控制器名稱空間

HTML/JS 呼叫android方法開發 Android

由於業務需求和大趨勢導致,目前縱觀很多APP。很多都是用H5+native的方式去開發。關於wepApp和nativeApp它們之前的是是非非就不說了。 下面是利用H5應該是JS去呼叫本地Android的程式碼。 不是什麼特別高深的東西。 第一佈局: 1 <RelativeLayout