我了解回调函数,但我无法理解promise方法以及async和await。为什么要在节点js中使用这三个函数。可以给出示例代码的说明。
答案 0 :(得分:0)
回调是一个作为参数传递给另一个函数的函数,它在最后执行。像这样:
function(callback){
//you do some tasks here that takes time
callback();
}
回调是一种处理异步代码的方法。例如,您可能需要从节点应用程序中的文件中读取数据,并且此过程需要时间。因此,nodejs可以执行其他任务,然后在执行回调之后返回,而不是在读取时阻止代码。
许诺也将像回调方法一样处理异步代码,但采用更具可读性的方式。例如,代替此:
example(function(){
return example1(function(){
return example2(function(){
return example3(function(){
done()
})
})
})
})
这样使它更具可读性:
example()
.then(example1)
.then(example2)
.then(example3)
.then(done)
异步函数用于编写异步代码,特别是Promise。在此函数的内部,关键字 await 用于中止诺言的执行,直到兑现为止。换句话说,它等待promise解析,然后恢复异步功能。例如:
async function example(){
var data = await getData() // it waits until the promise is resolved
return data;
}
答案 1 :(得分:0)
回调功能
var fs = require('fs');
fs.readFile(fileName, 'utf8', function read(err, contents) {
console.log(contents);
});
console.log('after calling readFile');
此处函数read(err,contents){}是一个回调函数,在读取文件完成后将打印内容。 但是在某些情况下,问题可能是“在调用readFile之后”在读取文件之前显示到控制台。 当Node Js以异步模式执行语句时。
承诺
var fs = require('fs');
function readMyFile(fileName)
{
return new Promise(function(resolve,reject)
{
fs.readFile(fileName, 'utf8', function read(err, contents) {
if(err)
reject(err)
else
resolve(contents)
});
}
}
var file = readMyFile(fileName).then(result=>{console.log(result);console.log('after calling readFile'); }).catch(err=>{console.log("Error Occurred",err)});
console.log(file);
此处函数readMyFile(fileName)是一个返回诺言的函数,该函数将在then块中打印内容,并在catch块中显示错误。 但是在这里,执行 console.log(file); 行而无需等待定义 file变量
异步/等待
var fs = require('fs');
function readMyFile(fileName)
{
return new Promise(function(resolve,reject)
{
fs.readFile(fileName, 'utf8', function read(err, contents) {
if(err)
reject(err)
else
resolve(contents)
});
}
}
async function read()
{
var file = await readMyFile(fileName);
console.log(file);
}
在这里等待行,直到 file变量获得其值