国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript 異步調用

2019-11-19 15:05:08
字體:
來源:轉載
供稿:網友

問題

可修改下面的 aa() 函數,目的是在一抄后用 console.log() 輸出 want-value

function aa() {  setTimeout(function() {    return "want-value";  }, 1000);}

但是,有額外要求:

aa() 函數可以隨意修改,但是不能有 console.log()

執行 console.log() 語句里不能有 setTimeout 包裹

解答

也許這是個面試題,管它呢。問題的主要目的是考察對異步調用執行結果的處理,既然是異步調用,那么 不可能同步等待異步結果,結果一定是異步的

setTimeout() 經常用來模擬異步操作。最早,異步是通過回調來通知(調用)處理程序處理結果的

function aa(callback) {  setTimeout(function() {    if (typeof callback === "function") {      callback("want-value");    }  }, 1000);}aa(function(v) {  console.log(v);});

不過回調在用于稍大型一點的異步應用時,容易出現多層嵌套,所以之后提出了一些對其進行“扁平”化,這一部分可以參考閑談異步調用“扁平”化。當然 Promise 是非常流行的一種方法,并最終被 ES6 采納。用Promise 實現如下:

function aa() {  return new Promise(resolve => {    setTimeout(function() {      resolve("want-value");    }, 1000);  });}aa().then(v => console.log(v));

就這個例子來說,它和前面回調的例子大同小異。不過它會引出目前更推薦的一種方法――async/await,從 ES2017 開始支持:

function aa() {  return new Promise(resolve => {    setTimeout(function() {      resolve("want-value");    }, 1000);  });}async function main() {  const v = await aa();  console.log(v);}main();

aa() 的定義與 Promise 方法中的定義是一樣的,但是在調用的時候,使用了 await ,異步等待,等待到異步的結果之后,再使用 console.log() 對其進行處理。

這里需要注意的是 await 只能在 async 方法中使用,所以為了使用 await 必須定義一個 async 的 main 方法,并在全局作用域中調用。由于 main 方法是異步的(申明為 async),所以如果 main() 調用之后還有其它語句,比如 console.log("hello") ,那么這一句話會先執行。

async/await 語法讓異步調用寫起來像寫同步代碼,在編寫代碼的時候,可以避免邏輯跳躍,寫起來會更輕松。(參考: 從地獄到天堂,Node 回調向 async/await 轉變 )

當然,定義 main() 再調用 main() 這部分可以用 IIFE 封裝一下,

(async () => {  const v = await aa();  console.log(v);})();

總結

以上所述是小編給大家介紹的JavaScript 異步調用,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 甘谷县| 教育| 天镇县| 延庆县| 仙游县| 南华县| 黑龙江省| 镇康县| 临朐县| 乡城县| 吉林省| 台州市| 抚松县| 芒康县| 会昌县| 南汇区| 吉木萨尔县| 五寨县| 达日县| 南漳县| 高碑店市| 册亨县| 古交市| 嘉荫县| 陆丰市| 望谟县| 汉中市| 镇安县| 深水埗区| 怀化市| 西安市| 谢通门县| 江安县| 景洪市| 砀山县| 宁晋县| 五指山市| 宝坻区| 潜山县| 揭西县| 靖远县|