Promise解决异步操作问题

问题:
当有多个回调函数后,就无法保证其输出的顺序性了,而采用嵌套的方式虽可以解决这个问题,但是代码样式太丑,且很乱,Promise的出现就是为了解决这个问题

多个回调函数

var  fs = require('fs');
 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){
   if(err){
     throw err;
   }
   console.log(data);
 })

 fs.readFile('./files/3.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/2.txt','utf8',function(err,data){
    console.log(data);
    //读取第三个异步任务
    fs.readFile('./files/3.txt','utf8',function(err,data){
      console.log(data);
    })
  })
})

起步

在 new Promise()容器放入回调函数

//语法:new Promise(function(callback){})
var  fs = require('fs');
var promise = new Promise(function(resolve,reject){
  //两个参数 resolve 异步执行成功的回调函数,reject异步执行失败的回调函数
  fs.readFile('./files/1.txt', 'utf8', function (err, data) {
    if (err) {
      throw err;
    }
    console.log(data);
  })
});

基本使用

在 new Promise()容器放入回调函数后,通过resolve将参数里的值带出来
then里面的参数data就是resolve()括号里的值
(简化起见,不写err)

var fs = require('fs');
var promise = new Promise(function (resolve) {
  fs.readFile('./files/1.txt', 'utf8', function (err, data) {
      resolve(data);
  })
});


promise.then(function (data) {
  console.log('成功:' + data); 
});

封装

一层封装

var fs = require('fs');


function getFile(path){
return new Promise(function (resolve) {
  fs.readFile(path, 'utf8', function (err, data) {
      resolve(data);
  })
});
}

getFile('./files/1.txt').then(function (data) {
  console.log('成功:' + data) 
})

对于代码重复的回调函数可以链式使用.then封装,如下

var fs = require('fs');


function getFile(path){
return new Promise(function (resolve) {
  fs.readFile(path, 'utf8', function (err, data) {
      resolve(data);
  })
});
}

getFile('./files/1.txt')
.then(function (data) {
  console.log('====>' + data)
  return getFile('./files/2.txt')
})
.then(function(data){
  console.log('====>' + data)
  return getFile('./files/3.txt')
})
.then(function(data){
  console.log('====>' + data)
})

执行多次异步操作

var promise1 = getFileByPath('./files/1.txt');
var promise2 = getFileByPath('./files/2.txt');
var promise3 = getFileByPath('./files/3.txt');


Promise.all([promise3,promise1,promise2]).then(function(data){
  console.log(data); 
},function(err){
  console.log(err);
})
发布了178 篇原创文章 · 获赞 32 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43560272/article/details/104346551