Promise对象

本文详细介绍了如何使用Promise对象进行异步操作的链式回调,通过读取多个文件的例子,展示了Promise解决异步操作顺序问题的有效性。

Promise对象可以用来做异步操作中的链式回调。
比如 我们要先读取文件a,再读取文件b,在读取文件c,在fs的api中,读取文件是异步的,并不能保证读取这三个文件的顺序,要想有序,必须把三个读取操作嵌套起来,而用promise链式编程,解决了这个问题。

 new Promise(function(resolve,reject){})

Promise构造函数的参数function方法有两个参数,第一个是成功时回调的函数,第二个是失败是回调的函数。
下面看代码,有详细的注释,我们先定义了三个Promise对象,里面是读取文件的异步操作,我们控制一下对三个文件内容输出顺序的控制

var file1 = new Promise(function(resolve, reject) {
  fs.readFile('./data/a.txt', 'utf8', function(err, data) {
    if (err) {
      console.log('error')
      reject(err)
    } else {
      console.log('aaaaaaaaaaaaaaa')
      resolve(data)
    }
  })
})

var file2 = new Promise(function(resolve, reject) {
  fs.readFile('./data/b.txt', 'utf8', function(err, data) {
    if (err) {
      reject(err)
    } else {
      console.log('bbbbbbbbbbbbbb')
      resolve(data)
    }
  })
})

var file3 = new Promise(function(resolve, reject) {
  fs.readFile('./data/c.txt', 'utf8', function(err, data) {
    if (err) {
      reject(err)
    } else {
      console.log('ccccccccccccc')
      resolve(data)
    }
  })
})
/**
 *
 * 上面读取文件时,我们定义成了三个变量,因为是异步的,至于哪个文件先读出来,是不确定的,
 * 我们下面代码用promise对他们读取的值输出做一下顺序控制。(如果不定义上面三个变量,
 * 直接把变量还原到下面代码中,三个文件的读取也会是有顺序的[都写在一起一套代码太大了,
 * 不利于看,我给定义成了三个变量,放到了外面,下面代码用来控制输出内容的顺序])
 * Promise.then()方法中
 *    第一个function是Promise的构造参数的resolve,表示成功时执行的函数
 *    第二个function函数是Promise的构造参数reject,表示失败时的执行函数
 *
 * 如果在then方法中又返回了Promise对象,后面的then中参数还是按照上面的规则,
 * 如果then方法中返回的不是Promise对象,则在下一个then中方法的参数就是上一个then的return值
 */

file1
  .then(
    function(data) { //file1读取成功时执行的回调函数
      console.log(data)
      return file2
    },
    function(err) {//file1读取失败时执行的回调函数
      console('error', err)
    }
  )
  .then(function(data) {//file2读取成功时执行的回调函数
    console.log(data)
    return file3
  })
  .then(function(data) {//file3读取成功时执行的回调函数
    console.log(data)
    return 'abcde'
  })
  .then(function(data) {
    console.log(data)
  })

因为异步读取文件顺序时不确定的,所以aaaaaaaaaaaaaaaa bbbbbbbbbbbb ccccccccccccc 这几个的输出顺序是不确定的,这里不要纠结

执行结果
执行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值