Module 02 · Asynchronous I/O with callback programming异步 I/O 与回调编程
Cheatsheet - Asynchronous I/O with Callback Programming速查表:异步 I/O 与回调编程
| 包/方法 | 描述 | 代码示例 |
|---|---|---|
| Async-await | 我们可以在异步函数内部等待 promises。 | const axios = require('axios').default; let url = "some remote url" async function asyncCall() { console.log('calling'); const result = await axios.get(url); console.log(result.data); } asyncCall(); |
| 回调 | 回调是作为参数传递的方法。它们在传递它们作为参数的方法内被调用,可以是有条件或无条件的。 我们使用回调与 promise 一起处理响应或错误。 | //function(res) 和 function(err) 是匿名回调函数 axios.get(url).then(function(res) { console.log(res); }).catch(function(err) { console.log(err) }) |
| Promise | 由某些方法返回的对象,表示最终的完成或失败。代码继续运行而不会被阻塞,直到 promise 被满足或抛出异常。 | axios.get(url).then( //执行某些操作 ).catch( //执行某些操作 ) |
| Promise 使用案例 | 当我们调用的函数处理时间较长,例如远程 URL 访问、I/O 操作文件读取等,使用 promises。 | let prompt = require('prompt-sync')(); let fs = require('fs'); const methCall = new Promise((resolve,reject)=>{ let filename = prompt('文件名是什么?'); try { const data = fs.readFileSync(filename, {encoding:'utf8', flag:'r'}); resolve(data); } catch(err) { reject(err) } }); console.log(methCall); methCall.then( (data) => console.log(data), (err) => console.log("读取文件时出错") ); |
| object.on() | 定义一个事件处理程序,当事件发生时框架调用它 | http.request( options, function(response) { let buffer = ‘’; ... response.on('data', function(chunk) { buffer += chunk; }); response.on('end', function() { console.log(buffer); }); }).end(); |
| 回调地狱/厄运金字塔 | 嵌套的回调一个接一个地堆叠,等待前一个回调。这会创建一个金字塔结构,影响代码的可读性和可维护性。 | const makeCake = nextStep => { buyIngredients(function(shoppingList) { combineIngredients(bowl, mixer, function(ingredients){ bakeCake(oven, pan, function(batter) { decorate(icing, function(cake) { nextStep(cake); }); }); }); }); }; |
| Axios 请求 | axios 包处理 HTTP 请求并返回 promise 对象。 | const axios = require('axios').default; const connectToURL=(url)=>{ const req=axios.get(url); console.log(req); req.then(resp=>{ console.log("已满足"); console.log(resp.data); }) .catch(err=>{ console.log("已拒绝"); }); } connectToURL('valid-url') connectToURL('invalid-url') |