DEV Community

ChuangWANG
ChuangWANG

Posted on

Node.js 异步

setTimeout(function() {
},time)

function callback() {
  console.log("This is the test.")
}
function callback_test(time, callback) {
  setTimeout(function(){
    console.log("test")
    let result = 0
    callback(0)
  },time)
}
Enter fullscreen mode Exit fullscreen mode
/*
需求:异步的按顺序去读取1.txt、2.txt、3.txt文件的内容
假设 1.txt内容为111 、2.txt内容为222、3.txt内容为333
*/
var  fs = require('fs');
 fs.readFile('./files/1.txt','utf8',function(err,data){
   if(err){
     throw err;
   }
   console.log(data);
 })

 fs.readFile('./files/1.txt','utf8',function(err,data){
   if(err){
     throw err;
   }
   console.log(data);
 })

 fs.readFile('./files/1.txt','utf8',function(err,data){
   if(err){
     throw err;
   }
   console.log(data);
 })
/*
 结果:111 222 333。(好像满足需求啊)
*/

/* 
问题:上面的代码虽然正常按照顺序读取了文件,因为文件的内容都非常少,io读取耗时少,但当2.txt内容较多时候,2.txt的内容是最后输出的。因为他们都是异步操作,不知道谁先读取完。 这得取决于异步任务IO的耗时。
*/

/*
常规解决办法:
在第一个异步任务读取成功之后再读取第二个异步任务,
第二成功后,在读取第三个异步任务
*/
//读取第一个异步任务
fs.readFile('./files/1.txt','utf8',function(err,data){
  if(err){
    throw err;
  }
  console.log(data);
  //读取第二个异步任务
  fs.readFile('./files/2.txt','utf8',function(err,data){
    console.log(data);
    //读取第三个异步任务
    fs.readFile('./files/3.txt','utf8',function(err,data){
      console.log(data);
    })
  })
})

/* 
结果: 111 222 333 (这必须按照顺序输出的,结果杠杆的)  
*/

/*
问题:
以上按照顺序执行多个异步任务产生的问题:`回调地狱`问题(层层包裹进行回调,代码也不够优雅)
*/

/* 
解决办法:采用es6,提供的promise来解决上述产生的问题。
*/
Enter fullscreen mode Exit fullscreen mode

image

let test = new Promise((resolve, reject)=>{
  if(true) {
    return resolve("secceed.")
  } else {
    return reject("failed")
  }
})

let test001 = function method(resolve, reject) {
  if(false) {
    resolve("1")

  }else {
    reject("2")
  }
}

new Promise(test001).then(()=> console.log("secceed")).catch(()=>console.log("failed"))

// new Promise(test001).then(
//     function() {
//       console.log("succeed!!!")
//     }
//   )
// .catch(
//   function() {
//     console.log("failed!!!")
//   }
// ) 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)