JavaScript同步與異步任務問題詳解
js會出現異步問題場景
- 延時操作
- 數據請求同異步
- promise 異步
- 回調涵數(最常見多內置涵數支持接收回調涵數來異步代碼 )
- 事件監聽 如,click事件等異步
- 訂閱與發佈
今天遇到的問題是,請求數據時間太長,會先執行之後的代碼,
初步預想的解決方法:
- 使用箭頭涵數,使用涵數的返回值,讓請求與之後的代碼 同步執行
- 異步請求修改變成同步
- async/await-Promise-讓異步操作同步執行
- 開關涵數
- 延時操作
標題延時操作
缺點:不知請求數據需要多長時間,之後的數據需要延遲多少時間展示,是個問題。
function tes0t() { fn1(); fn2(); fn3(); } function fn1() { console.log(1); } function fn2() { setTimeout(function () { console.log(2); }, 1000); } function fn3() { setTimeout(function () { console.log(3); }, 0); } tes0t();
開關涵數
預期輸出是:1,2,3,
實際輸出是:1,3,2,
所以達不到想要的效果
var kai=false function tes0t() { fn1(); fn2(); fn3(); } function fn1() { console.log(1); } function fn2() { setTimeout(function () { console.log(2); kai= true; }, 1000); // console.log(); } function fn3() { setTimeout(function () { console.log(3); }, 0); } tes0t();
jQuery異步請求設置為同步請求
是否達到預期效果,不知道
$.ajaxSettings.async = false;//同步請求 Global_MBPage.$gt(url, params, function (json) {} $.ajaxSettings.async = true;//異步請求 - 默認是異步
使用箭頭涵數,涵數的返回值,讓請求與之後的代碼 同步執行
測試是可以達到預期效果,輸出結果是1,2,3
function tes0t() { fn1(); fn2(1, 1, () => {fn3();}); } function fn1() { console.log(1); } function fn2(n1, n2, n3) { setTimeout(function () { console.log(2); if (n3) n3.call();//返回值的設置 }, 1000); } function fn3() { setTimeout(function () { console.log(3); }, 0); } tes0t();
async/await-Promise-讓異步操作同步執行
function fn4(){ return new Promise(resolve=>{ setTimeout(function(){ msg='等啥 ' resolve(msg) },1000) }) } async function aC(){ var result = await fn4(); console.log(result); } aC()
// 輸出為‘ 等啥 ’
到此這篇關於JavaScript同步與異步任務問題詳解的文章就介紹到這瞭,更多相關JavaScript同步與異步 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Vue中的同步調用和異步調用方式
- JS中的async與await怎麼使用
- es7中的async、await使用方法示例詳解
- vue中Promise的使用方法詳情
- 前端常見面試題之async/await和promise的區別