本文目錄一覽:
js中for循環中需要調用非同步方法,怎麼確保執行的順序
既然是非同步,就不可能用for循環,
因為for循環體中是沒有辦法暫停等待非同步調用的。
應該用函數遞歸的方式循環
如何優雅的處理Nodejs中的非同步回調
Nodejs最大的亮點就在於事件驅動, 非阻塞I/O 模型,這使得Nodejs具有很強的並發處理能力,非常適合編寫網路應用。在Nodejs中大部分的I/O操作幾乎都是非同步的,也就是我們處理I/O的操作結果基本上都需要在回調函數中處理,比如下面的這個讀取文件內容的函數:
fs.readFile(‘/etc/passwd’, function (err, data) { if (err) throw err;
console.log(data);
});
那,我們讀取兩個文件,將這兩個文件的內容合併到一起處理怎麼辦呢?大多數接觸js不久的人可能會這麼干:
fs.readFile(‘/etc/passwd’, function (err, data) { if (err) throw err;
fs.readFile(‘/etc/passwd2’, function (err, data2) { if (err) throw err; // 在這裡處理data和data2的數據 });
});
那要是處理多個類似的場景,豈不是回調函數一層層的嵌套啊,這就是大家常說的回調金字塔或回調地獄()的問題,也是讓js小白最為頭疼的問題。
這種層層嵌套的代碼給開發帶來了很多問題,主要體現在:
代碼可能性變差
調試困難
出現異常後難以排查
本文主要是介紹如何優雅的處理以上非同步回調問題。
初級方案:通過遞歸處理非同步回調
我們可以使用遞歸作為代碼的執行控制工具。把需要執行的操作封裝到一個函數中,在回調函數中通過遞歸調用控制代碼的執行流程,廢話不多說,上個代碼吧:
var fs = require(‘fs’);// 要處理的文件列表var files = [‘file1’, ‘file2’, ‘file3’];function parseFile () { if (files.length == 0) { return;
} var file = files.shift();
fs.readFile(file, function (err, data) { // 這裡處理文件數據
parseFile(); // 處理完畢後,通過遞歸調用處理下一個文件 });
}// 開始處理parseFile();
以上代碼已依次處理數組中的文件為例,介紹了通過遞歸的方式控制代碼的執行流程。
應用到一些簡單的場景中還是不錯的,比如:我們將一個數組中的數據,依次保存到資料庫中就可以採用這種方式。
通過遞歸的方式可以解決一些簡單的非同步回調問題。不過對於處理複雜的非同步回調還是顯得有些無能為力(如需要同步多個非同步操作的結果)。
js image對象的onload是非同步還是同步
非同步。你可以創建多個image對象,在控制台看。它們是一起在載入。不會等上一個載入完了再載入下一個。如果你想等上一個載入完再載入下一個,可以使用遞歸的方式進行載入。
JS遞歸的常見用法
求 1-100 的和
1,1,2,3,5,8,13,21,34,55,89…求第 n 項
JS 遞歸 假如樓梯有 n 個台階,每次可以走 1 個或 2 個台階,請問走完這 n 個台階有幾種走法
原理: clone(o) = new Object; 返回一個對象
1、很多時候可以用遞歸代替循環,可以理解為遞歸是一種特殊的循環,但通常情況下不推薦這樣做。
2、遞歸一般是在函數裡面把函數自己給調用一遍,通過每次調用改變條件,來結束循環。
3、遞歸在數據格式一致,在數據層級未知的情況下,比普通的遍歷更有優勢。
4、遞歸在非同步的時候,更容易理解,且更容易實現,因為可以在非同步的回調裡面,調用自己來實現每次都能拿到非同步的結果再進行其他操作。
5、遞歸實現的快速排序比普通遍歷實現的排序效率更好。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/308227.html