回调函数、Promise和async/await之间的区别

4

我理解回调函数,但是我不理解 Promise 方法和 async 和 await。为什么要在 Node.js 中使用这三个函数?能否用示例代码来解释一下。


2
询问如何寻找教程的问题不符合 SO 的主题。请阅读此主题相关 [提问指南]。 - Yury Tarabanko
2个回答

4

回调函数

回调函数是作为另一个函数的参数传递的一种函数,它在结束时执行。代码示例如下:

function(callback){

   //you do some tasks here that takes time

   callback();
}

回调函数是处理异步代码的一种方法。例如,您可能需要在Node应用程序中从文件中读取数据,而这个过程需要时间。因此,为了避免在读取时阻塞您的代码,Node.js会在执行回调后返回并执行其他任务。

Promise

Promise也是处理异步代码的一种方式,但更易读。例如,不使用回调函数的写法:

example(function(){
    return example1(function(){
        return example2(function(){
            return example3(function(){
                done()
            })
        })
    })
})

这样做可以使其更易读:
example()
    .then(example1)
    .then(example2)
    .then(example3)
    .then(done)

异步函数/等待

异步函数用于编写异步代码,特别是处理Promise. 在这个函数内部使用关键字await来暂停promise的执行,直到它被解析。换句话说,它等待Promise解析完成,然后恢复异步函数的执行。例如:

async function example(){
    var data = await getData() // it waits until the promise is resolved
    return data;
}

1

Callback Function

var fs = require('fs');

fs.readFile(fileName, 'utf8', function read(err, contents) {
   console.log(contents);
});

console.log('after calling readFile');

这里的函数read(err, contents){}是一个回调函数,当读取文件完成后打印出文件内容。 但在某些情况下的问题可能是,在读取文件之前,“after calling readFile”会被显示到控制台。 因为Node Js以异步模式执行语句。

Promise

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)是一个返回promise的函数,在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);
}

在这里等待,直到文件变量获得其值

  • await只能与Promise一起使用
  • await只能在异步函数内部使用

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接