Promise对象的resolve回调函数和reject回调函数使用

Promise是ES6中用来结局回调地狱的问题的但是并不能帮我们减少代码量

  1. Promise是一个构造函数 new Promise() 得到一个Promise一个实例
  2. 在Promise上有两个函数分别是resolve(成功之后的回调函数)和reject(失败之后的回调函数)
  3. 在Promise构造函数的prototype属性上,有一个.then()方法,也就是只要是Promise构造函数创建的实例,都可以访问到.then()方法
  4. 如果Promise表示一个异步操作,每当我们new一个Promise的实例,这个实例就表示一个具体的异步操作
  5. 既然Promise创建的实例是一个异步操作那么这个异步操作的结果只能有两种状态
    • 状态一:异步执行成功 需要在内部调用,成功的回调函数resolve 把结果返回给调用者
    • 状态二:异步执行失败了 需要在内部调用,成功的回调函数reject把结果返回给调用者
    • 由于Promise的实例是一个异步操作,所以拿到操作结果后,无法使用return把操作结果返回给调用者,这个时候只能使用回调函数的形式,来把成功或者失败的结果返回给调用者
  6. 我们可以在new出来的Promise实例上,调用.then()方法【预先】为这个Promise一部操作,指定成功(resolve)和失败(reject)回调函数

  实现原理:(以读取文件为例)

 1 //这是一个具体的异步操作,其中使用function 指定一个具体的异步操作
 2 var promise = new Promise(function () {
 3     //这个function 内部写的就是具体的异步操作
 4 })
 5 //每当new一个Promise实例的时候,就会立即执行这个异步操作中的代码
 6 //如果不想立即执行需要放在一个函数中调用才执行
 7 function getFile(fpath) {
 8     var promise = new Promise(function (resolve,reject) {
 9         fs.readFile(fpath,‘utf-8‘,function (err,data) {
10             if(err) {
11                 //console.log(err.message)
12                 reject(err)
13                 return false
14             }
15             //console.log(data);
16             resolve(data)
17         })
18     });
19     return promise
20 }
21 var p = getFile(path).then(function (data) {
22     console.log(data)
23 },function (err) {
24     console.log(err.message)
25 })

回调地狱的写法(了解即可)

getFile(path.join(__dirname,‘./file/1.txt‘)).then((data)=>{
    console.log(data);
    getFile(path.join(__dirname,‘./file/2.txt‘)).then((data)=>{
        console.log(data);
        getFile(path.join(__dirname,‘./file/3.txt‘)).then((data)=>{
            console.log(data);
        })
    })
})

注意:回调嵌套只会降低效率,并且如果需要读取的文件太多,不好排错,在没有将代码执行完毕之前你永远不知道这段代码是在干什么

正确的写法:

//在上一个.then中返回一个新的promise实例,可以继续用下一个.then来处理
getFile(‘路径1‘).then(function (data) {
    console.log(1,data);
    return getFile(‘路径2‘)
}).then(function (data) {
    console.log(2,data);
    return getFile(‘路径3‘)
}).then(function (data) {
    console.log(3,data);
})

如果执行失败了不想影响后续的promise的正常执行此时我们需要单独为每一个promise通过.then指定一下失败的回调

getFile(path).then(function (data) {
    console.log(data)
  return getFile(path)
},function (err) {
    console.log(err.message)
  return getFile(path)
}).then(function (data) {
    console.log(data)
  return getFile(path)
},function (err) {
    console.log(err.message)
  return getFile(path)
})

不管是正确的回调函数还是失败的回调函数都需要将下一个回调函数所需要的对象return出去

如果前面的失败了,则后面的就没有继续执行下去的意义,此时我们想实现一旦报错则立即终止所有的promise的执行;

//在promise的最后使用catch
.catch(function (err) {
    //catch如果前面有任何的promise执行失败,则立即终止所有promise的执行并马上进入catch去处理promise中抛出异常
    console.log(‘这是自己的处理方式:‘+err.message)
})

原文地址:https://www.cnblogs.com/HMleilei/p/10323212.html

时间: 2024-10-04 18:38:52

Promise对象的resolve回调函数和reject回调函数使用的相关文章

谈谈 ES6 的 Promise 对象

前言 开篇首先设想一个日常开发常常会遇到的需求:在多个接口异步请求数据,然后利用这些数据来进行一系列的操作.一般会这样去写: $.ajax({ url: '......', success: function (data) { $.ajax({ // 要在第一个请求成功后才可以执行下一步 url: '......', success: function (data) { // ...... } }); } }); 这样的写法的原理是,当执行一些异步操作时,我们需要知道操作是否已经完成,所有当执行

前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象

JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous). “同步模式”就是一个任务完成之后,后边跟着一个任务接着执行:程序的执行顺序和排列顺序是一直的:”异步模式”则完全不同,每一个任务都有一个或者多个回调函数(callback),前一个任务结束的时候,不是执行下一个任务,二十执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务顺序不一致的,异步的. 在浏览器端,耗时时间长的操作都应该异步执行,避免浏览器数去

对Promise中的resolve,reject,catch的理解

想必接触过Node的人都知道,Node是以异步(Async)回调著称的,其异步性提高了程序的执行效率,但同时也减少了程序的可读性.如果我们有几个异步操作,并且后一个操作需要前一个操作返回的数据才能执行,这样按照Node的一般执行规律,要实现有序的异步操作,通常是一层加一层嵌套下去. 为了解决这个问题,ES6提出了Promise的实现... 一   Promise 对象的含义? Promise 对象用于一个异步操作的最终完成(或失败)及其结果值的表示.简单点说,它就是用于处理异步操作的,异步处理成

关于多个Promise对象及then()函数的执行顺序的研究记录

今天终于想要研究一下多个 Promise 对象的执行顺序问题了,在研究完后记录一下. 我想研究的是以下问题: 1.多个 Promise 对象及其then函数的执行顺序,这里不研究处于不同状态的 Promise 对象的执行顺序 2.在 Promise 中的定时器延时问题(这个问题其实在 MDN 和阮一峰老师的 ES6 入门中都讲过,只是我光看文字有点晕,所以自己写代码来理解) 废话不多说,先上代码吧 // 延时执行 new Promise(resolve => setTimeout(() =>

deferred对象和promise对象(一)

个人认为阮一峰老师讲的关于deferred对象是最容易理解的. deferred对象是jquery的回调函数解决方案.解决了如何处理耗时操作的问题,对那些操作提供了更好的控制,以及统一的编程接口. deferred对象的功能: 1.将ajax操作改为链式 对于$.ajax()操作完成之后,如果使用的是低于1.5版本的jquery,返回的是XHR对象,高于1.5版本返回的是deferred对象.deferred对象可进行链式操作. $.ajax({ url:"test.html", su

Promise对象

promise是异步编程的一种解决方案,promise对象代表一个异步操作. promise对象有三种状态:pending(进行中),resolved(已完成)和rejected(已失败),只有异步操作的结果可以决定当前是哪一种状态,任何其他操作都无法改变这个状态. Promise对象是一个构造函数,用来生成Promise实例. var promise = new Promise(function(resolve, reject) { // ... some code if (/* 异步操作成功

ES6 Promise对象

Promise  ,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. Promise 对象有以下两个特点. (1)对象的状态不受外界影响. Promise 对象代表一个异步操作,有三种状态: Pending (进行中). Resolved (已完成,又称 Fulfilled )和 Rejected (已失败).只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态. (2)一旦状态改变,就不会再变,任何时候都可以得到这个结果. Promis

ES6 - promise对象

Promise的设计初衷 我们使用ajax请求数据,得到数据后再对数据进行操作,可是有时候,对得到的数据进行操作的过程中,可能又要用到ajax请求,这时,我们的代码就变成了这样: $.ajax({ success:function(res1){ //...请求B开始,B依赖A返回的数据 $.ajax({ sucess:function(res2){ //...请求C开始,C依赖B返回的数据 $.ajax({ sucess:function(res3){ } }); } }); } }); 这种写

浅谈Javascript中Promise对象的实现

https://segmentfault.com/a/1190000000684654 What? Promise是CommonJS的规范之一,拥有resolve.reject.done.fail.then等方法,能够帮助我们控制代码的流程,避免函数的多层嵌套.如今异步在web开发中越来越重要,对于开发人员来说,这种非线性执行的编程会让开发者觉得难以掌控,而Promise可以让我们更好地掌控代码的执行流程,jQuery等流行的js库都已经实现了这个对象,年底即将发布的ES6也将原生实现Promi