• 同步异步


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

     5. async

    异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码变成同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了。

    • 在普通函数定义的前面加上async关键字,普通函数就变成了异步函数
    • 异步函数默认的返回值是promise对象
    • 在异步函数内使用throw关键字进行错误的抛出
     1 // 1. 在普通函数定义的前面加上async关键字,普通函数就变成了异步函数
     2 // 2. 异步函数默认的返回值是promise对象
     3 // 3. 在异步函数内使用throw关键字进行错误的抛出
     4 async function fn () {
     5   throw '发生了一些错误'
     6   return 123;
     7 }
     8 fn().then(data => {
     9   console.log(data)
    10 }).catch(error=> {
    11   console.log(error);
    12 })

    await关键字

    • 它只能出现在异步函数中
    • await promise 它可以暂停异步函数的执行,等待promise对象返回结果后再向下执行函数
     1 async function p1() {
     2   return 'p1';
     3 }
     4 async function p2() {
     5   return 'p2';
     6 }
     7 async function p3() {
     8   return 'p3';
     9 }
    10 async function run () {
    11   await p1()
    12   await p2()
    13   await p3()
    14 }
     1 const fs = require('fs');
     2 const promisify = require('util').promisify;
     3 
     4 const readFile = promisify(fs.readFile);
     5 
     6 async function run () {
     7   let r1 = await readFile('./1.txt', 'utf8');
     8   let r2 = await readFile('./2.txt', 'utf8');
     9   let r3 = await readFile('./3.txt', 'utf8');
    10   console.log(r1);
    11   console.log(r2);
    12   console.log(r3);
    13 }
    14 run();
  • 相关阅读:
    【科普】.NET 泛型
    吐槽,青岛科技大学真他妈操蛋
    c# 数组和集合精讲
    c# System.Text.Json 精讲
    .NET 5的System.Text.Json的JsonDocument类讲解
    c#中Array,ArrayList 与List<T>的区别、共性与转换
    代码是怎么运行的?
    .NET6使用DOCFX根据注释自动生成开发文档
    spring通过注解注册bean的方式+spring生命周期
    莫比乌斯反演
  • 原文地址:https://www.cnblogs.com/guwufeiyang/p/13236133.html
Copyright © 2020-2023  润新知