回调函数与Promise和Async awit之间的区别

时间:2019-05-08 07:04:19

标签: node.js nodejs-stream nodejs-server

我了解回调函数,但我无法理解promise方法以及async和await。为什么要在节点js中使用这三个函数。可以给出示例代码的说明。

2 个答案:

答案 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变量获得其值

  • await仅在诺言下起作用
  • await只能在异步函数中使用