同步非同步
阿新 • • 發佈:2020-07-04
1.同步API,非同步API的區別(獲取返回值)
同步API可以從返回值中拿到API執行的結果,但是非同步API是不可以的。
1 // 同步 2 function sum (n1, n2) { 3 return n1 + n2; 4 } 5 const result = sum (10, 20);
1 // 非同步 2 function getMsg() { 3 setTimeout(function() { 4 return {msg: 'hello node.js'} 5 }, 2000); 6 } 7 const msg = getMsg(); 8 console.log(msg); //undefined
2. 回撥函式
自己定義函式讓別人去呼叫。
// getData函式定義 function getData (callback) {} // getData函式呼叫 getData (() => {});
3. 程式碼執行順序分析
console.log('程式碼開始執行'); setTimeout(() => { console.log('2秒後執行的程式碼'); }, 2000); setTimeout(() => { console.log('"0秒"後執行的程式碼'); }, 0); console.log('程式碼結束執行');
4. promise
promise出現的目的是解決node.js非同步程式設計中回撥地獄的問題。
let promise = new Promise((resolve, reject) => { setTimeout(()=> { if (true) { resolve({name: '張三'}) } else { reject('失敗了') } }, 2000); }); promise.then(result => console.log(result)) // {name: '張三'} .catch(error => console.log(error)); //失敗了
const fs = require('fs'); let promise = new Promise((resolve, reject)=> { fs.readFile('./1.txt', 'utf8', (err, result)=> { if( err !== null) { reject(err) } else { resolve(result); } }) }); promise.then((result)=> { console.log(result); })
先後列印三個非同步函式
1 const fs = require('fs'); 2 function p1() { 3 return new Promise((resolve, reject)=> { 4 fs.readFile('./1.txt', 'utf8', (err, result)=> { 5 if( err !== null) { 6 reject(err) 7 } else { 8 resolve(result); 9 } 10 11 }) 12 }); 13 } 14 function p2() { 15 return new Promise((resolve, reject)=> { 16 fs.readFile('./2.txt', 'utf8', (err, result)=> { 17 if( err !== null) { 18 reject(err) 19 } else { 20 resolve(result); 21 } 22 }) 23 }); 24 } 25 function p3() { 26 return new Promise((resolve, reject)=> { 27 fs.readFile('./3.txt', 'utf8', (err, result)=> { 28 if( err !== null) { 29 reject(err) 30 } else { 31 resolve(result); 32 } 33 }) 34 }); 35 } 36 37 p1().then(r1 => { 38 console.log(r1); 39 return p2(); 40 }).then(r2 => { 41 console.log(r2); 42 return p3(); 43 }).then(r3 => { 44 console.log(r3); 45 })