1. 程式人生 > 實用技巧 >同步非同步

同步非同步

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 })