node中Promise使用

node中Promise使用实例
需求:现有三个文件需要依次读取文件内容



// a.json
{
“next”: “b.json”,
“massage”: “this is a file content”
}



b.json
{
“next”: “c.json”,
“massage”: “this b file content”
}



c.json
{
“next”: “null”,
“massage”: “this c file content”
}
目录结构:
在这里插入图片描述



实现方法如下:



// 方法一: callback获去文件的内容
const fs = require(“fs”)
const path = require(“path”)



// 定义一个函数去获取文件内容
function getFileContent(fileName, callback) {
const fullFilename = path.resolve(__dirname, “files”, fileName)
fs.readFile(fullFilename, (err, data) => {
if(err){
console.error(err)
return
}
// 调用callback函数处理读取到的数据
callback(
// readFile中读取的文件内容为buffer因此需要转为字符串
JSON.parse(data.toString())
)
})
}



getFileContent(“a.json”, aData => {
console.log(“a data”, aData)
getFileContent(aData.next, bData => {
console.log(“b data”, bData)
getFileContent(bData.next, cData => {
console.log(“c data”, cData)
})
})
})



// 方法二: 使用Promise和then连用获取文件内容
const fs = require(“fs”)
const path = require(“path”)



function getFileContent(fileName) {
const promise = new Promise((resolve, reject) => {
const fullFilename = path.resolve(__dirname, “files”, fileName)
fs.readFile(fullFilename, (err, data) => {
if(err) {
reject(err)
return
}
resolve(
JSON.parse(data.toString())
)
})
})
return promise
}



// promise后面接 .then 可以获取resolve 里面的内容
getFileContent(“a.json”).then(aData => {
console.log(“a data”, aData)
return getFileContent(aData.next)
}).then(bData => {
console.log(“b data”, bData)
return getFileContent(bData.next)
}).then(cData => {
console.log(“c data”, cData)
})



// 方法三: 使用async await 和 Promise连用实现同步读取文件
const fs = require(“fs”)
const path = require(“path”)



function getFileContent(fileName) {
const promise = new Promise((resolve, reject) => {
const fullFilename = path.resolve(__dirname, “files”, fileName)
fs.readFile(fullFilename, (err, data) => {
if(err) {
reject(err)
return
}
resolve(
JSON.parse(data.toString())
)
})
})
return promise
}



async function readFileData() {
// 同步
try {
const aData = await getFileContent(“a.json”)
console.log(“a data”, aData)
const bData = await getFileContent(aData.next)
console.log(“b data”, bData)
const cData = await getFileContent(bData.next)
console.log(“c data”, cData)
} catch(err) {
console.error(err)
}
}



readFileData()
注意⚠️:
async await使用要点:
// 1. await 后面可以追加 promise 对象,获取 resolve 的值
// 2. await 必须包裹在 async 函数里面
// 3. async 函数执行返回的也是一个 promise 对象
// 4. try-catch 截获 promise 中 reject 的值

https://blog.csdn.net/danieljackz/article/details/97520141



Javascript的特点是异步,Javascript不能等待,如果你实现某件需要等待的事情,你不能停在那里一直等待结果回来,相反,底线是使用回调callback:你定义一个函数,这个函数只有等到结果可用时才能被调用。



这种回调模型对于好的代码组织是没有问题的,但是也可以通过从原始回调切换到promise解决很多问题,将promise看成是一个标准的数据容器,这样会简化你的代码组织,可以成为基于promise的架构。



什么是Promise?
 一个promise是一个带有”.then()”方法的对象,其代表的是一个操作的结果可能还没有或不知道,无论谁访问这个对象,都能够使用”.then()”方法加入回调等待操作出现成功结果或失败时的提醒通知,。



 那么为什么这样做好处优于回调呢?标准的回调模式在我们处理请求时需要同时提供回调函数:



request(url, function(error, response) {



// handle success or error.



});



doSomethingElse();



 很不幸,这段代码意味着这个request函数并不知道它自己什么时候能够完成,当然也没有必要,我们最终通过回调传递结果。这会导致多个回调形成了嵌套回调,或者称为回调陷阱。



queryTheDatabase(query, function(error, result) {



request(url, function(error, response) {



doSomethingElse(response, function(error, result) {

doAnotherThing(result, function(error, result) {

request(anotherUrl, function(error, response) {

...

});

});

});


});



});



 Promise能够解决这种问题,允许低层代码创建一个request然后返回一个对象,其代表着未完成的操作,让调用者去决定应该加入什么回调。



Promise是什么?
 promise是一个异步编程的抽象,它是一个返回值或抛出exception的代理对象,一般promise对象都有一个then方法,这个then方法是我们如何获得返回值(成功实现承诺的结果值,称为fulfillment)或抛出exception(拒绝承诺的理由,称为rejection),then是用两个可选的回调作为参数,我们可以称为onFulfilled和OnRejected:



var promise = doSomethingAync()
promise.then(onFulfilled, onRejected)



 当这个promise被解决了,也就是异步过程完成后,onFulfilled和OnRejected中任何一个将被调用,



 因此,一个promise有下面三个不同状态:



pending待承诺 - promise初始状态
fulfilled实现承诺 - 一个承诺成功实现状态
rejected拒绝承诺 - 一个承诺失败的状态



https://www.jdon.com/idea/nodejs/promise.html
https://www.jianshu.com/p/e48f76d41532
https://www.cnblogs.com/linwenbin/p/12656664.html
https://blog.csdn.net/cdnight/article/details/50857876
https://www.jianshu.com/p/60a2129af455



收尾执行-finally
就是不管怎么样,都会执行的方法,即使是抛异常了



chenqionghe(3)
.then(function () {
return get(2)
})
.then(function () {
throw new Error(“abc”);
return muscle(1)
})
.catch(function (e) {
console.log(“异常:” + e.message)
})
.finally(function () {
console.log(“最后都会执行的方法”)
})
;



https://www.cnblogs.com/chenqionghe/p/11406666.html



Category algorithm