摘要:解決辦法,將箭頭函數(shù)聲明為函數(shù),代碼如下運(yùn)行結(jié)果至此,問(wèn)題解決。必須在函數(shù)的上下文中。對(duì)程序而言有了上下文調(diào)用幀才有一個(gè)完整的邏輯過(guò)程。
先簡(jiǎn)單介紹下async await:
async/await是ES6推出的異步處理方案,目的也很明確:更好的實(shí)現(xiàn)異步編程。 詳細(xì)見(jiàn)阮大神 ES6入門
現(xiàn)在說(shuō)說(shuō)實(shí)踐中遇到的問(wèn)題:使用await報(bào)錯(cuò)Unexpected identifier
先上代碼:
var sleep = function (time) { return new Promise(function (resolve, reject) { setTimeout(function () { resolve(("999")); }, time); }) }; let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] var start = async function(){ arr.forEach(()=>{ console.log( await sleep(2000) ) }) } start();
在循環(huán)中使用sleep方法,這時(shí)候報(bào)錯(cuò):Unexpected identifier
原因:通過(guò)查資料發(fā)現(xiàn)一句話 await必須在async函數(shù)的上下文中。(后面重點(diǎn)講)通過(guò)個(gè)人理解的這句話就是await只能在async函數(shù)中使用。
以上面的代碼為例子,雖然最外層start函數(shù)是通過(guò)async聲明的,在start函數(shù)體內(nèi)部的箭頭函數(shù)中使用了await,而該箭頭函數(shù)是一個(gè)普通函數(shù),所以await的上文是一個(gè)普通函數(shù),最終導(dǎo)致報(bào)錯(cuò)。
解決辦法,將箭頭函數(shù)聲明為async函數(shù),代碼如下:
var sleep = function (time) { return new Promise(function (resolve, reject) { setTimeout(function () { resolve(console.log("999")); }, time); }) }; let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] var start = function(){ arr.forEach(async ()=>{ await sleep(2000) }) } start();
運(yùn)行結(jié)果:
至此,問(wèn)題解決。
await必須在async函數(shù)的上下文中。----出處
上下文,英文context,其完整意思應(yīng)當(dāng)是concatenate-text,聯(lián)系文本,編程中翻譯為“引用池”或者“引用區(qū)”更加恰當(dāng)。----百度百科
先舉個(gè)例子:
③.小明說(shuō):重啟試試
單從這句話我們不能知道重啟什么、為什么小明要說(shuō)這句話(可能你覺(jué)得是電腦)、對(duì)誰(shuí)說(shuō)的這句話
②.小紅說(shuō)對(duì)小明說(shuō)她微信出來(lái)不了輸入法
這就是小明為什么說(shuō)這句話的上文(背景),這時(shí)候才能知道小明說(shuō)的重啟是微信程序or手機(jī)(真不是電腦)
①.小紅和小明躺在床上玩手機(jī)
這句也是背景,但是卻不能成為③的上文,因?yàn)椤疤纱采稀辈⒉皇恰爸貑⒃囋嚒钡脑颍ɑ蛘哒f(shuō)背景)
函數(shù)調(diào)用會(huì)在內(nèi)存形成一個(gè)"調(diào)用記錄",又稱"調(diào)用幀"(call frame),保存調(diào)用位置和內(nèi)部變量等信息
個(gè)人理解:上文指出了環(huán)境、背景。
拿本文中的第一段錯(cuò)誤代碼來(lái)說(shuō),await的上文是一個(gè)普通箭頭函數(shù),所以使用await會(huì)報(bào)錯(cuò),因?yàn)榫幾g器在執(zhí)行到await時(shí),當(dāng)前調(diào)用幀是箭頭函數(shù)而不是外層的start,所以此時(shí)的await就像:小明和小紅躺在床上 小明說(shuō)“重啟試試” ,是無(wú)意義(Unexpected identifier)的。
這時(shí)候談?wù)勏挛?,接上面的例?/p>
④.小紅重啟了手機(jī)
④就是③的下文
上下文結(jié)合在一起才能構(gòu)建一個(gè)完整的邏輯
比如④和③就是上下文,我們才能將其聯(lián)系起來(lái),如果只有④或者④和②,從邏輯上來(lái)說(shuō)都不是完整的。
對(duì)程序而言 有了上下文“調(diào)用幀”才有一個(gè)完整的邏輯過(guò)程。計(jì)算機(jī)才知道下一步該去哪,該回到哪。
需要注意的是,上下文是一個(gè)整體,上面將其分開(kāi)只是為了理解,實(shí)際過(guò)程中,不存在多帶帶的上文和下文,所以這是await 必須在async 的上下文 的具體意義。
原文首發(fā)地址:http://www.cnblogs.com/lonhon...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/91783.html
摘要:有兩個(gè)陌生的關(guān)鍵字,同時(shí)函數(shù)執(zhí)行結(jié)果似乎返回了一個(gè)對(duì)象。用來(lái)表示函數(shù)是異步的,定義的函數(shù)會(huì)返回一個(gè)對(duì)象,可以使用方法添加回調(diào)函數(shù)。如果的是對(duì)象會(huì)造成異步函數(shù)停止執(zhí)行并且等待的解決如果等的是正常的表達(dá)式則立即執(zhí)行。 視頻講解 關(guān)于異步處理,ES5的回調(diào)使我們陷入地獄,ES6的Promise使我們脫離魔障,終于、ES7的async-await帶我們走向光明。今天就來(lái)學(xué)習(xí)一下 async-a...
摘要:一方面,這里替代的是異步代碼的編寫方式,并非完全拋棄大家心愛(ài)的,地球人都知道是基于的,不用太傷心另一方面,是基于回調(diào)函數(shù)實(shí)現(xiàn)的,那也沒(méi)有替代回調(diào)函數(shù)咯重構(gòu)代碼之后,我仍然用到了庫(kù)。 摘要: 夸張點(diǎn)說(shuō),技術(shù)的發(fā)展與歷史一樣,順之者昌,逆之者亡。JS開(kāi)發(fā)者們,趕緊擁抱Async/Await吧! GitHub倉(cāng)庫(kù): Fundebug/promise-asyncawait 早在半年多之前,...
摘要:對(duì)空數(shù)組是不會(huì)執(zhí)行回調(diào)函數(shù)的。就算改變已經(jīng)發(fā)生了,你再對(duì)對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。用來(lái)表示函數(shù)是異步的,定義的函數(shù)會(huì)返回一個(gè)對(duì)象,可以使用方法添加回調(diào)函數(shù)。 介紹 通過(guò)Array/Object/Function基礎(chǔ)類型編寫。 看到自己不了解的或者比較新穎的用法便會(huì)寫上。 不定時(shí)更新內(nèi)容。 本文首發(fā)于我的個(gè)人網(wǎng)站: Timbok.top 目錄 Array 迭代方法 ...
摘要:所以異步編程對(duì)語(yǔ)言太重要。異步編程我們就以用戶注冊(cè)這個(gè)特別常見(jiàn)的場(chǎng)景為例,講講異步編程。這種層層嵌套被稱為回調(diào)地獄。相比回調(diào)函數(shù)而言,代碼可讀性更高,代碼的執(zhí)行順序一目了然。函數(shù)內(nèi)部語(yǔ)句返回的值,會(huì)成為方法回調(diào)函數(shù)的參數(shù)。 單線程是Javascript語(yǔ)言最本質(zhì)的特性之一,Javascript引擎在運(yùn)行js代碼的時(shí)候,同一個(gè)時(shí)間只能執(zhí)行單個(gè)任務(wù)。 這種模式的好處是實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,執(zhí)行...
摘要:如果你還沒(méi)讀過(guò)上篇上篇和中篇并無(wú)依賴關(guān)系,您可以讀過(guò)本文之后再閱讀上篇,可戳面試篇寒冬求職季之你必須要懂的原生上小姐姐花了近百個(gè)小時(shí)才完成這篇文章,篇幅較長(zhǎng),希望大家閱讀時(shí)多花點(diǎn)耐心,力求真正的掌握相關(guān)知識(shí)點(diǎn)。 互聯(lián)網(wǎng)寒冬之際,各大公司都縮減了HC,甚至是采取了裁員措施,在這樣的大環(huán)境之下,想要獲得一份更好的工作,必然需要付出更多的努力。 一年前,也許你搞清楚閉包,this,原型鏈,就能獲得...
閱讀 3362·2021-11-25 09:43
閱讀 2168·2021-09-22 10:02
閱讀 3482·2021-09-06 15:00
閱讀 2367·2019-08-30 15:56
閱讀 2419·2019-08-30 15:54
閱讀 3293·2019-08-30 14:14
閱讀 2315·2019-08-29 17:25
閱讀 2985·2019-08-29 17:16