开发者社区> 流楚丶格念> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Promise简单使用

简介: Promise简单使用
+关注继续查看

什么是promise?


首先我们来看一个小案例


data文件夹下是三个文件,我们要写一个代码分别依次读取三个文件,使得按照 abc 的顺序输出


image


无法保证输出顺序的代码


fs.readFile('./data/a.txt', 'utf8', function (err, data) {
  if (err) {
    // 抛出异常
    //    1. 阻止程序的执行
    //    2. 把错误消息打印到控制台
    throw err
  }
  console.log(data)

})

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

})

fs.readFile('./data/c.txt', 'utf8', function (err, data) {
  if (err) {

    throw err
  }
  console.log(data)
})


这样写无法保证文件内容输出的顺序,应为读取文件函数为异步函数,那么如何解决这样的问题呢?


首先我们可以想到用嵌套的方法,后输出的放在代码最内部,先输出的放在代码最外部,但是这样一层层的嵌套使用,几个异步函数还好,当函数很多时就会显得非常不美观,而且不容易修改,还会产生一系列问题,这就产生了下面的回调地狱问题


回调地狱(callback hell)


下图代码就是回调地狱的一种,是不是像冲击波一样冲击着广大程序员的幼小的心灵。(豪油根~~~)


image


var fs = require('fs')

fs.readFile('./data/a.txt', 'utf8', function (err, data) {
  if (err) {
    throw err
  }
  console.log(data)
  fs.readFile('./data/b.txt', 'utf8', function (err, data) {
    if (err) {
      throw err
    }
    console.log(data)
    fs.readFile('./data/c.txt', 'utf8', function (err, data) {
      if (err) {
        throw err
      }
      console.log(data)
    })
  })
})


接下来我们用 ES6新增的Promise来解决回调地狱问题


Promise解决


当 p1 读取成功的时候


当前函数中 return 的结果就可以在后面的 then 中 function 接收到


  • 当你 return 123 后面就接收到 123


  • return ‘hello’ 后面就接收到 ‘hello’


  • 没有 return 后面收到的就是 undefined


上面那些 return 的数据其实是没什么der用的


真正有用的是:我们可以 return 一个 Promise 对象


当 return 一个 Promise 对象的时候,后续的 then 中的 方法的第一个参数会作为 p2 的 resolve


var fs = require('fs')

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

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

var p3 = new Promise(function (resolve, reject) {
  fs.readFile('./data/c.txt', 'utf8', function (err, data) {
    if (err) {
      reject(err)
    } else {
      resolve(data)
    }
  })
})

p1
  .then(function (data) {
    console.log(data)
    return p2
  }, function (err) {
    console.log('读取文件失败了', err)
  })
  .then(function (data) {
    console.log(data)
    return p3
  })
  .then(function (data) {
    console.log(data)
    console.log('end')
  })

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
35、Promise 对象
Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口。它起到代理作用(proxy),充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接口。Promise 可以让异步操作写起来,就像在写同步操作的流程,而不必一层层地嵌套回调函数。
19 0
Promise链式调用与升级版
promise链式调用,动态链式调用代码实现。
66 0
如何控制Promise的串行执行?
如何控制Promise的串行执行?
39 0
Promise总结
Promise是一种异步编程解决方案,es6中原生提供了Promise对象有三种状态:pending、resolved、rejected。状态一旦改变,就不会再变。 基本用法 var p = new Promise(function(resolve, reject){ resolve('成功') // or reject('失败') }) p.
681 0
Promise原理解读
promise是干什么的 在JavaScript的世界中,所有代码都是单线程执行的。由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。异步执行可以用回调函数实现,然而在需要多次回调嵌套的时候,就容易进入回调地狱了,promise解决了这一问题 Promise 是异步编程的一种解决方案,比传统的解决方案–回调函数和事件--更合理和更强大。
1951 0
Promise的前世今生
作者:@洗影 Promise 的历史 Promise 是一个古老的概念(最初提出于 1976 年),通常与 future 结合在一起。Future 指的是未来的值,通常在 Promise 里被作为参数和返回值传来传去(但是在有的语境下 Future 又被用来指代类似 Promise 的东西。
3162 0
漫谈promise使用场景
深入理解promise 对于现在的前端同学来说你不同promise你都不好意思出门了。对于前端同学来说promise已经成为了我们的必备技能。 那么,下面我们就来说一说promise是什么,它能帮助我们解决什么问题,我们应该如何使用它? 这是我个人对promise的理解。
1099 0
+关注
流楚丶格念
csdn平台优质创作者,51cto TOP博主,360图书馆科技博主,燕山大学目前大三在读,日拱一卒,功不唐捐,加油!!!
1010
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载