国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

記錄--沒有await,如何處理“回調(diào)地獄”

這篇具有很好參考價值的文章主要介紹了記錄--沒有await,如何處理“回調(diào)地獄”。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

這里給大家分享我在網(wǎng)上總結(jié)出來的一些知識,希望對大家有所幫助

記錄--沒有await,如何處理“回調(diào)地獄”

太長不看

  • 不要嵌套使用函數(shù)。給每個函數(shù)命名并把他們放在你代碼的頂層
  • 利用函數(shù)提升。先使用后聲明。
  • 處理每一個異常
  • 編寫可以復(fù)用的函數(shù),并把他們封裝成一個模塊

什么是“回調(diào)地獄”?

異步Javascript代碼,或者說使用callback的Javascript代碼,很難符合我們的直觀理解。很多代碼最終會寫成這樣:

fs.readdir(source, function (err, files) {
  if (err) {
    console.log('Error finding files: ' + err)
  } else {
    files.forEach(function (filename, fileIndex) {
      console.log(filename)
      gm(source + filename).size(function (err, values) {
        if (err) {
          console.log('Error identifying file size: ' + err)
        } else {
          console.log(filename + ' : ' + values)
          aspect = (values.width / values.height)
          widths.forEach(function (width, widthIndex) {
            height = Math.round(width / aspect)
            console.log('resizing ' + filename + 'to ' + height + 'x' + height)
            this.resize(width, height).write(dest + 'w' + width + '_' + filename, function(err) {
              if (err) console.log('Error writing file: ' + err)
            })
          }.bind(this))
        }
      })
    })
  }
})

看到上面金字塔形狀的代碼和那些末尾參差不齊的 }) 了嗎?這就是廣為人知的回調(diào)地獄了。
人們在編寫JavaScript代碼時,誤認為代碼是按照我們看到的代碼順序從上到下執(zhí)行的,這就是造成回調(diào)地獄的原因。在其他語言中,例如C,Ruby或者Python,第一行代碼執(zhí)行結(jié)束后,才會開始執(zhí)行第二行代碼,按照這種模式一直到執(zhí)行到當(dāng)前文件中最后一行代碼。隨著你學(xué)習(xí)深入,你會發(fā)現(xiàn)JavaScript跟他們是不一樣的。

什么是回調(diào)(callback)?

某種使用JavaScript函數(shù)的慣例用法的名字叫做回調(diào)。JavaScript語言中沒有一個叫“回調(diào)”的東西,它僅僅是一個慣例用法的名字。大多數(shù)函數(shù)會立刻返回執(zhí)行結(jié)果,使用回調(diào)的函數(shù)通常會經(jīng)過一段時間后才輸出結(jié)果。名詞“異步”,簡稱“async”,只是意味著“這將花費一點時間”或者說“在將來某個時間發(fā)生而不是現(xiàn)在”。通常回調(diào)只使用在I/O操作中,例如下載文件,讀取文件,連接數(shù)據(jù)庫等等。

當(dāng)你調(diào)用一個正常的函數(shù)時,你可以向下面的代碼那樣使用它的返回值:

var result = multiplyTwoNumbers(5, 10)
console.log(result)
// 50 gets printed out

然而使用回調(diào)的異步函數(shù)不會立刻返回任何結(jié)果。

var photo = downloadPhoto('http://coolcats.com/cat.gif')
// photo is 'undefined'!

在這種情況下,上面那張gif圖片可能需要很長的時間才能下載完成,但你不想你的程序在等待下載完成的過程中中止(也叫阻塞)。

于是你把需要下載完成后運行的代碼存放到一個函數(shù)中(等待下載完成后再運行它)。這就是回調(diào)!你把回調(diào)傳遞給downloadPhoto函數(shù),當(dāng)下載結(jié)束,回調(diào)會被調(diào)用。如果下載成功,傳入photo給回調(diào);下載失敗,傳入error給回調(diào)。

downloadPhoto('http://coolcats.com/cat.gif', handlePhoto)

function handlePhoto (error, photo) {
  if (error) console.error('Download error!', error)
  else console.log('Download finished', photo)
}

console.log('Download started')

人們理解回調(diào)的最大障礙在于理解一個程序的執(zhí)行順序。在上面的例子中,發(fā)生了三件事情。

  1. 聲明handlePhoto函數(shù)
  2. downloadPhoto函數(shù)被調(diào)用并且傳入了handlePhoto最為它的回調(diào)
  3. 打印出Download started。

請大家注意,起初handlePhoto函數(shù)僅僅是被創(chuàng)建并被作為回調(diào)傳遞給了downloadPhoto,它還沒有被調(diào)用。它會等待downloadPhoto函數(shù)完成了它的任務(wù)才會執(zhí)行。這可能需要很長一段時間(取決于網(wǎng)速的快慢)。

這個例子意在闡明兩個重要的概念:

  1. handlePhoto回調(diào)只是一個存放將來進行的操作的方式
  2. 事情發(fā)生的順序并不是直觀上看到的從上到下,它會當(dāng)某些事情完成后再跳回來執(zhí)行。

怎樣解決“回調(diào)地獄”問題?

糟糕的編碼習(xí)慣造成了回調(diào)地獄。幸運的是,編寫優(yōu)雅的代碼不是那么難!

你只需要遵循三大原則

1. 減少嵌套層數(shù)(Keep your code shallow)

下面是一堆亂糟糟的代碼,使用browser-request做AJAX請求。

var form = document.querySelector('form')
form.onsubmit = function (submitEvent) {
  var name = document.querySelector('input').value
  request({
    uri: "http://example.com/upload",
    body: name,
    method: "POST"
  }, function (err, response, body) {
    var statusMessage = document.querySelector('.status')
    if (err) return statusMessage.value = err
    statusMessage.value = body
  })
}
這段代碼包含兩個匿名函數(shù),我們來給他們命名。
var form = document.querySelector('form')
form.onsubmit = function formSubmit (submitEvent) {
  var name = document.querySelector('input').value
  request({
    uri: "http://example.com/upload",
    body: name,
    method: "POST"
  }, function postResponse (err, response, body) {
    var statusMessage = document.querySelector('.status')
    if (err) return statusMessage.value = err
    statusMessage.value = body
  })
}

如你所見,給匿名函數(shù)一個名字是多么簡單,而且好處立竿見影:

  • 起一個一望便知其函數(shù)功能的名字讓代碼更易讀
  • 當(dāng)拋出異常時,你可以在stacktrace里看到實際出異常的函數(shù)名字,而不是"anonymous"
  • 允許你合理安排函數(shù)的位置,并通過函數(shù)名字調(diào)用它

現(xiàn)在我們可以把這些函數(shù)放在我們程序的頂層。

document.querySelector('form').onsubmit = formSubmit

function formSubmit (submitEvent) {
  var name = document.querySelector('input').value
  request({
    uri: "http://example.com/upload",
    body: name,
    method: "POST"
  }, postResponse)
}

function postResponse (err, response, body) {
  var statusMessage = document.querySelector('.status')
  if (err) return statusMessage.value = err
  statusMessage.value = body
}

請大家注意,函數(shù)聲明在程序的底部,但是我們在函數(shù)聲明之前就可以調(diào)用它。這是函數(shù)提升的作用。

2.模塊化(Modularize)

任何人都有有能力創(chuàng)建模塊,這點非常重要。寫出一些小模塊,每個模塊只做一件事情,然后把他們組合起來放入其他的模塊做一個復(fù)雜的事情。只要你不想陷入回調(diào)地獄,你就不會。讓我們把上面的例子修改一下,改為一個模塊。

下面是一個名為formuploader.js的新文件,包含了我們之前使用過的兩個函數(shù)。

module.exports.submit = formSubmit

function formSubmit (submitEvent) {
  var name = document.querySelector('input').value
  request({
    uri: "http://example.com/upload",
    body: name,
    method: "POST"
  }, postResponse)
}

function postResponse (err, response, body) {
  var statusMessage = document.querySelector('.status')
  if (err) return statusMessage.value = err
  statusMessage.value = body
}

module.exports是node.js模塊化的用法。現(xiàn)在已經(jīng)有了?formuploader.js?文件,我們只需要引入它并使用它。請看下面的代碼:

var formUploader = require('formuploader')
document.querySelector('form').onsubmit = formUploader.submit

我們的應(yīng)用只有兩行代碼并且還有以下好處:

  1. 方便新開發(fā)人員理解你的代碼 -- 他們不需要費盡力氣讀完formuploader函數(shù)的全部代碼
  2. formuploader可以在其他地方復(fù)用

3.處理每一個異常(Handle every single error)

有三種不同類型的異常:語法異常,運行時異常和平臺異常。語法異常通常由開發(fā)人員在第一次解釋代碼時捕獲,運行時異常通常在代碼運行過程中因為bug觸發(fā),平臺異常通常由于沒有文件的權(quán)限,硬盤錯誤,無網(wǎng)絡(luò)鏈接等問題造成。這一部分主要來處理最后一種異常:平臺異常。

前兩個大原則意在提高代碼可讀性,但是第三個原則意在提高代碼的穩(wěn)定性。在你與回調(diào)打交道的時候,你通常要處理發(fā)送請求,等待返回或者放棄請求等任務(wù)。任何有經(jīng)驗的開發(fā)人員都會告訴你,你從來不知道哪里回出現(xiàn)問題。所以你有必要提前準(zhǔn)備好,異??偸菚l(fā)生。

把回調(diào)函數(shù)的第一個參數(shù)設(shè)置為error對象,是Node.js中處理異常最流行的方式。

var fs = require('fs')

 fs.readFile('/Does/not/exist', handleFile)

 function handleFile (error, file) {
   if (error) return console.error('Uhoh, there was an error', error)
   // otherwise, continue on and use `file` in your code
 }
把第一個參數(shù)設(shè)為error對象是一個約定俗成的慣例,提醒你記得去處理異常。如果它是第二個參數(shù),你更容易把它忽略掉。

本文轉(zhuǎn)載于:

https://juejin.cn/post/7294166986195533843

如果對您有所幫助,歡迎您點個關(guān)注,我會定時更新技術(shù)文檔,大家一起討論學(xué)習(xí),一起進步。

?記錄--沒有await,如何處理“回調(diào)地獄”文章來源地址http://www.zghlxwxcb.cn/news/detail-760445.html

到了這里,關(guān)于記錄--沒有await,如何處理“回調(diào)地獄”的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 什么是異步編程?什么是回調(diào)地獄(callback hell)以及如何避免它?

    什么是異步編程?什么是回調(diào)地獄(callback hell)以及如何避免它?

    前端入門之旅:探索Web開發(fā)的奇妙世界 記得點擊上方或者右側(cè)鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅!這個專欄是為那些對Web開發(fā)感興趣、剛剛踏入前端領(lǐng)域的朋友們量身打造的。無論你是完全的新手還是有一些基礎(chǔ)的開發(fā)者,這里都將為你提供一

    2024年02月10日
    瀏覽(20)
  • 【Ajax】回調(diào)地獄解決方法

    回調(diào)地獄(Callback Hell)是指在異步編程中,特別是在嵌套的回調(diào)函數(shù)中,代碼變得深度嵌套、難以閱讀和維護的現(xiàn)象。這通常發(fā)生在處理多個異步操作時,每個操作都依賴于前一個操作的結(jié)果。回調(diào)地獄使代碼變得難以理解、擴展和調(diào)試,降低了代碼的可維護性和可讀性。

    2024年02月13日
    瀏覽(40)
  • 回調(diào)地獄Axios

    ## 解決回調(diào)地獄:Promise 和 Axios 在現(xiàn)代的前端開發(fā)中,處理異步操作和網(wǎng)絡(luò)請求是非常常見的任務(wù)。使用 Promise 和 Axios 可以更輕松地管理異步代碼和發(fā)送網(wǎng)絡(luò)請求。 ### Promise Promise 是一種用于處理異步操作的對象,它有三種狀態(tài):pending(進行中)、fulfilled(已成功)、reje

    2024年02月04日
    瀏覽(21)
  • 解決微信小程序回調(diào)地獄問題

    一、背景 ? ? 小程序開發(fā)經(jīng)常遇到根據(jù)網(wǎng)絡(luò)請求結(jié)果,然后繼續(xù) 處理下一步業(yè)務(wù)操作,代碼如下: 這段代特點:層層嵌套,邏輯負責(zé)可讀性低,不易維護。解決方案使用?new?Promise((resolve,?reject)?=?{})可使用異步順序執(zhí)行來解決。 二、代碼示例 第一個請求函數(shù)代碼示例 第

    2024年02月09日
    瀏覽(27)
  • 響應(yīng)式編程Reactor優(yōu)化Callback回調(diào)地獄

    Reactor 是一個基于Reactive Streams規(guī)范的響應(yīng)式編程框架。它提供了一組用于構(gòu)建異步、事件驅(qū)動、響應(yīng)式應(yīng)用程序的工具和庫。Reactor 的核心是 Flux (表示一個包含零到多個元素的異步序列)和 Mono 表示一個包含零或一個元素的異步序列)。 Reactor 通過提供響應(yīng)式的操作符,如

    2024年02月02日
    瀏覽(22)
  • 【Promise】一文帶你了解promise并解決回調(diào)地獄

    【Promise】一文帶你了解promise并解決回調(diào)地獄

    為什么需要promise 需求 通過ajax請求id,再根據(jù)id請求用戶名,再根據(jù)用戶名獲取email 回調(diào)地獄 在回調(diào)函數(shù)中嵌套回調(diào) 在上述代碼中通過不斷請求數(shù)據(jù),代碼逐級向外遞歸,形成了回調(diào)地獄。 使用promise就可以完美解決,并且讓我們的代碼更加美觀。 Promise是一個構(gòu)造函數(shù),通過n

    2024年02月21日
    瀏覽(15)
  • uniapp微信小程序開發(fā)踩坑日記:uni.request回調(diào)函數(shù)地獄問題

    使用await和async無法解決uniapp中的回調(diào)函數(shù)地獄問題,因為uni.request并不返回一個 Promise。通常情況下,我們期望await能夠等待一個 Promise 或者其它類似 Promise 的對象,然后繼續(xù)執(zhí)行下面的代碼,但uni.request的 success 回調(diào)不符合這個預(yù)期 解決方案非常easy!改成用then來接收請求響

    2024年02月20日
    瀏覽(37)
  • 消滅異步回調(diào),還得是 async-await

    關(guān)于異步處理問題,ES5的回調(diào)讓我們陷入回調(diào)地獄輪回,后來ES6的Promise(Promise不了解?點這了解[1])讓我們脫離輪回,終于,ES7的async-await帶我們走向光明。今天我們就來學(xué)習(xí)一夏 async-await,看看與Promise有何聯(lián)系和區(qū)別。 一、走進Async-await原理 1、原理1 async函數(shù)返回一個

    2024年02月10日
    瀏覽(24)
  • 什么是Promise對象?它的狀態(tài)有哪些?如何使用Promise處理異步操作?以及 async、await

    什么是Promise對象?它的狀態(tài)有哪些?如何使用Promise處理異步操作?以及 async、await

    前端入門之旅:探索Web開發(fā)的奇妙世界 記得點擊上方或者右側(cè)鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅!這個專欄是為那些對Web開發(fā)感興趣、剛剛踏入前端領(lǐng)域的朋友們量身打造的。無論你是完全的新手還是有一些基礎(chǔ)的開發(fā)者,這里都將為你提供一

    2024年02月11日
    瀏覽(52)
  • 你的 VSCode 上 還沒有 GitHub Copilot ?看這里

    你的 VSCode 上 還沒有 GitHub Copilot ?看這里

    GitHub Copilot 是由 OpenAI 和 GitHub 開發(fā)的 AI 工具。其目的是通過自動完成代碼來幫助開發(fā)人員使用集成開發(fā)環(huán)境 (IDE),如 Visual Studio Code。它目前僅作為技術(shù)預(yù)覽版提供,因此只有已加入候補名單的用戶才能訪問它。對于使用 Python、JavaScript、Ruby、Go、TypeScript 和 Ruby 編寫代碼

    2024年02月03日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包