本文目錄一覽:
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-hant/n/308227.html