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