express promise async await promisify 回调函数

本文介绍了JavaScript中的Promise概念,包括其作用、状态机模型(等待、成功、失败)、示例代码、Promise.all的并发操作以及如何使用async/await和promisify进行异步编程。

Promise 概述

Promise 是 JavaScript 中异步编程解决方案,可以解决回调函数方案中的回调地狱问题可以将 Promise 理解为容器,用于包裹异步 API的容器,当容器中的异步 API执行完成后,Promise 允许我们在容器的外面获取异步API的执行结果,从而避免回调函数嵌套。Promise 翻译为承若,表示它承若帮我们做一些事情,既然它承若了它就要去做,做就会有一个过程、就会有一个结果,结果要么是成功要么是失败。
所以在 Promise 中有三种状态,分别为等待(pending),成功(fulfilled),失败(rejected)。默认状态为等待,等待可以变为成功,等待可以变为失败状态一旦更改不可改变,成功不能变回等待,失败不能变回等待,成功不能变成失败,失败不能变成成功。

在这里插入图片描述

Promise示例代码

示例1

let myPro = new Promise((resolve, reject)=>{
    setTimeout(()=>{
        resolve(5)
    },1000)
}).then(() => {
    console.log(123)
})

输出

123

示例2

let myPro = new Promise((resolve, reject)=>{
    const currentTime = new Date();
    const formattedTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}:${currentTime.getMilliseconds()}`;
    console.log(formattedTime);
    for (let i = 0; i < 1000000000; i++) {

    }
    resolve()
}).then(() => {

})
const currentTime = new Date();
const formattedTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}:${currentTime.getMilliseconds()}`;
console.log(formattedTime);
console.log(123)

输出:

20:18:50:45
20:18:50:486
123

示例3

let p1 = new Promise((resolve, reject) => setTimeout(reject, 300, "失败"))
let p2 = new Promise(resolve => setTimeout(resolve, 100, 2))
let p3 = 3
const currentTime = new Date();
const formattedTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}:${currentTime.getMilliseconds()}`;
console.log(formattedTime);
Promise.all([p1, p2, p3]).then(value => {
    const currentTime = new Date();
    const formattedTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}:${currentTime.getMilliseconds()}`;
    console.log(formattedTime);
    console.log(value)
})

输出

20:43:12:671
(node:25908) UnhandledPromiseRejectionWarning: 失败                    
(Use `node --trace-warnings ...` to show where the warning was created)
(node:25908) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch blo
ck, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejec
tions=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:25908) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the No
de.js process with a non-zero exit code.

Promise.all 并发操作

示例1

Promise.all([
    readFile('D:\\work\\jjBest\\0.txt'),
    readFile('D:\\work\\jjBest\\1.txt'),
    readFile('D:\\work\\jjBest\\2.txt')
]).then(function (res) {
    console.log(res)
})

示例2

let p1 = new Promise(resolve => setTimeout(resolve, 300, 1))
let p2 = new Promise(resolve => setTimeout(resolve, 100, 2))
let p3 = 3
const currentTime = new Date();
const formattedTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}:${currentTime.getMilliseconds()}`;
console.log(formattedTime);
Promise.all([p1, p2, p3]).then(value => {
    const currentTime = new Date();
    const formattedTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}:${currentTime.getMilliseconds()}`;
    console.log(formattedTime);
    console.log(value)
})

输出

20:39:25:180
20:39:25:483
[ 1, 2, 3 ]

Promise.allSettled

示例1

let p1 = new Promise((resolve, reject) => setTimeout(reject, 300, "失败"))
let p2 = new Promise(resolve => setTimeout(resolve, 100, 2))
let p3 = 3
const currentTime = new Date();
const formattedTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}:${currentTime.getMilliseconds()}`;
console.log(formattedTime);
Promise.allSettled([p1, p2, p3]).then(value => {
    const currentTime = new Date();
    const formattedTime = `${currentTime.getHours()}:${currentTime.getMinutes()}:${currentTime.getSeconds()}:${currentTime.getMilliseconds()}`;
    console.log(formattedTime);
    console.log(value)
})

输出

20:45:57:235
20:45:57:543
[                                        
  { status: 'rejected', reason: '失败' },
  { status: 'fulfilled', value: 2 },     
  { status: 'fulfilled', value: 3 }      
] 

async

加上async就是异步函数了,返回值类型为Promise
返回值会自动包裹在promise中

示例1

async function getTitle(){
    return "标题"
}
console.log(getTitle())
Promise { '标题' }

示例2

async function getTitle() {
    return "标题"
}

getTitle().then(value => console.log(value))

输出

标题

await

异步函数关键字 await

await 关键字后面只能放置返回 Promise 对象的 API。
await 关键字可以暂停函数执行,等待 Promise
执行完后返回执行结果 await 关键字只能出现在异步函数中。

示例1

function readFile(path){
    return new Promise(function (resolve, reject) {
        fs.readFile(path,'utf-8',function (err, data) {
            if (err){
                reject(err)
            }else {
                resolve(data)
            }
        })
    })
}

// 加上async就是异步函数了
async function run(){
    let x = await readFile('D:\\work\\jjBest\\0.txt');
    console.log(x)
    let y = await readFile('D:\\work\\jjBest\\1.txt');
    console.log(y)
    return [x,y]
}
run().then(function (res) {
    console.log(res)
})

示例2

function testWait() {
    return new Promise((resolve, reject) => {
        setTimeout(function () {
            console.log("testWait");
            resolve();
        }, 1000);
    })
}

async function testAwaitUse(){
    await testWait()
    console.log("hello")
    return "test"
}
console.log(testAwaitUse())

输出

Promise { <pending> }
testWait
hello

示例3

function testWait() {
    return new Promise((resolve, reject) => {
        setTimeout(function () {
            console.log("testWait");
            resolve();
        }, 1000);
    })
}

async function testAwaitUse(){
    testWait()
    console.log("hello")
    return "test"
}
console.log(testAwaitUse())

输出

hello             
Promise { 'test' }
testWait

promisify

使用promisify后,不用声明readFile的promise函数了。

const promisify = require('util').promisify
const readFile = promisify(fs.readFile)

// 加上async就是异步函数了
async function run() {
    let x = await readFile('D:\\work\\jjBest\\0.txt', "utf-8");
    console.log(x)
    let y = await readFile('D:\\work\\jjBest\\3.txt', "utf-8");
    console.log(y)
    return [x, y]
}

run().then(function (res) {
    console.log(res)
}).catch(function (err) {
    console.log(err)
})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学知识拯救世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值