同步API,异步API

同步API:只有当前API执行完成后,才能继续执行下一个API

```
console.log('before');
console.log('after');
```

异步API:当前API的执行不会阻塞后续代码的执行

```
console.log('before');
setTimeout(function(){
console.log('last')
},2000)
console.log('after');
```

同步API,异步API的区别(获取返回值)

同步API可以从返回值中拿到API执行的结果,但是异步API不可以的

回调函数

自己定义函数让别人去调用

```
function getData(callback){
callback()
}
getData(function(){
console.log('callback函数被调用了')
})
```
```
function getData(callback){
callback('糖糖糖')
}
getData(function(n){
console.log('callback函数被调用了')
console.log(n)
})
```
```
function getMsg(callback){
setTimeout(function(){
callback({
msg:'hello node.js'
})
},2000)
}
getMsg(function(data){
console.log(data)
})
```

同步API,异步API的区别(代码执行顺序)

同步API从上到下依次执行,前面代码会阻塞后面代码的执行

异步API不会等待API执行完成后再向下执行代码

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');
fs.readFile('./1.txt','utf8',(err,result1)=>{
console.log(result1)
fs.readFile('./2.txt','utf8',(err,result2)=>{
console.log(result2)
fs.readFile('./3.txt','utf8',(err,result3)=>{
console.log(result3)
})
})

})

//promise解决回调地狱

const fs = require('fs');

function p1(){

return new Promise((resolve,reject)=>{

fs.readFile('./1.txt','utf8',(err,result)=>{

resolve(result);

})

})

}

function p2(){

return new Promise((resolve,reject)=>{

fs.readFile('./2.txt','utf8',(err,result)=>{

resolve(result);

})

})

}

function p3(){

return new Promise((resolve,reject)=>{

fs.readFile('./3.txt','utf8',(err,result)=>{

resolve(result);

})

})

}

p1().then((r1)=>{

console.log(r1)

return p2()

}).then((r2)=>{

console.log(r2)

return p3()

}).then((r3)=>{

console.log(r3)

})

const fs = require('fs');

let promise = new Promise((resolve,reject)=>{

fs.readFile('./100.txt','utf8',(err,result)=>{

if(err !=null){

reject(err);

}else{

resolve(result);

}

})

})

promise.then((result)=>{

console.log(result);

}).catch((err)=>{

console.log(err)

})

09-Node.js学习笔记-异步编程的更多相关文章

  1. Node.js学习笔记(2):基本模块

    Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...

  2. 一点感悟:《Node.js学习笔记》star数突破1000+

    写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...

  3. Node.js学习笔记(3):NPM简明教程

    Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...

  4. 系列文章--Node.js学习笔记系列

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  5. Node.js学习笔记(1):Node.js快速开始

    Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...

  6. Node.js学习笔记(4):Yarn简明教程

    Node.js学习笔记(4):Yarn简明教程. 引入Yarn NPM是常用的包管理工具,现在我们引入是新一代的包管理工具Yarn.其具有快速.安全.可靠的特点. 安装方式 使用npm工具安装yarn ...

  7. Node.js学习笔记(1) - Node.js简介

    近期在看一些Node.js的知识,看完后觉得,一些前面的东西忘记了,于是整理一下,方便自己查阅,也希望对学习Node.js的朋友有些帮助: 当然以下只是我个人的观点和理解,不喜勿喷,也望大神指教. 一 ...

  8. Node.js学习笔记(2)——关于异步编程风格

    Node.js的异步编程风格是它的一大特点,在代码中就是体现在回调中. 首先是代码的顺序执行: function heavyCompute(n, callback) { var count = 0, ...

  9. Node.js学习笔记(六) --- Nodejs 的非阻塞 I/O、 异步、 事件驱动

    1. Nodejs 的单线程 非阻塞 I/O 事件驱动在 Java. PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程.而每个线程需要耗费大约 2MB 内存.也就是说,理论 ...

随机推荐

  1. 笔记||Python3之再识函数

    变量的作用域: 全局变量   -----  可以在函数内部被引用 局部变量   -----  函数内部 -- 只能在函数里面使用,在函数外部不能使用 在函数内部修改全局变量:global   x 缺省 ...

  2. 【全栈修炼】396- OAuth2 修炼宝典

    一.OAuth 概念 开放授权(OAuth)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用.-- 维基百科 ...

  3. 01-使用pipenv管理项目环境

    一.使用pipenv管理项目环境 首先为什么我们不在真实环境下做开发呢?真实环境的一些包被其他服务所依赖,我们安装的包和模块都混杂在一起,这样不便于项目管理,还有可能出现意想不到的错误,于是就出现了包 ...

  4. rails 中各种去重查询操作

    Table.select("DISTINCT name").map(&:name) : DISTINCT name去重查询name Table.active.map{|x| ...

  5. 安装Django、Nginx和uWSGI

    安装Django.Nginx和uWSGI 1.确定已经安装了2.7版本的Python: 2.安装python-devel yum install python-devel 3.安装uwsgi pip ...

  6. 微信小程序视图层介绍及用法

    一. 视图层 WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件.事件系统,可以构建出页面的结构. 1.1. 数据绑定 1.1.1. 普通写法 <vi ...

  7. 在项目中在线使用Iconfont图标

    Iconfont真的很强大,图标数量惊人,基本任意的关键词都能搜索到你想要的结果.而且是国产的,网速会比较快,还可以改变图标颜色. 它提供svg.png.ai三种格式下载,之前我一直都是乖乖的一个个下 ...

  8. 搭建Android开发环境 以及 ionic 编译安卓app步骤

    1. 下载安装JDK 下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...

  9. 使用 SQL 服务器时,"评估期已过期"错误消息

    当打开sql server2008企业管理器的时候,出现报错“评估期已过.有关如何升级的测试版软件的信息.....” 修改注册表:HKEY_LOCAL_MACHINE/SOFTWARE/Microso ...

  10. Kali_Linux 中文乱码 修改更新源及更新问题

    Kali_Linux 中文乱码 修改更新源及更新问题 中文乱码问题 kali默认没有中文字符 当以中文安装或者切换编码换为中文后会出现乱码的情况 解决方法: 确定locales已经安装好, 使用 ap ...