JS中promise特点与信任问题解决

目录
  • 1.Promise的信任问题
    • 1.1信任问题
    • 1.2信任问题产生的原因
      • 1.2.1调用过早
      • 1.2.2调用过晚
      • 1.2.3回调未调用
      • 1.2.4调用次数过少或过多
      • 1.2.5未传递参数、环境值
      • #### 1.2.6吞掉错误和异常
  • 2.Promise的几个关键问题
    • 2.1怎么改变Promise的状态
    • 2.2Promise 指定多个回调
    • 2.3Promise 改变状态与指定回调的顺序问题
    • 2.4Promise.then方法的返回结果特点
    • 2.5异常穿透
  • 总结

1.Promise的信任问题

1.1信任问题

所谓的信任问题就是你给出事物逻辑,将逻辑处理交给第三方解决

(即回调函数),此时会出现第三方给出的数据结果不是你希望的那样。

比如重复调用,没掉用。下次你在使用它是就会产生信任问题

1.2信任问题产生的原因

1.2.1调用过早

这个问题主要是担心代码是否会引入类似于Zlago这样的副作用一种 JavaScript 开发人员虚构的疯狂恶魔,取名 Zalgo,**用来描述 JavaScript 中同步 / 异步的混乱**即一个任务有时异步操作,有是同步操作,可能会导致竞态条件

Promise解决

promise即使是立刻完成,也无法被立刻调用。根据Promise特性可知道

要想看到结果必须通过==.then调用==

也就是将结果统一成异步操作

1.2.2调用过晚

一个同步任务链无法按照上面的形式运行,即在任务链中,下一个任务,不一定

是在上一个任务被完全调度后在运行的。即按照预期有效的延迟另一个回调的发生

Promise解决

只要是通过then注册的回调都会下一个异步时机点发生时依次被调用。

回调中的任何一个都无法影响任何一个或延迟对其他回调的运用

eg:

p.then(function(){
    p.then(function(){
        console.log("c")
    });
    console.log("A")
});
p.then(function(){
    console.log("B")
});

输出结果是**A,B,C**

1.2.3回调未调用

产生原因:回调函数有js语法错误等

Promise解决

可通过p.catch()获取错误信息,因为即使回调函数中有错误,回调函数还是会被调用

可通过下面的方式解决

function timeout(delay){
    return new Promise(function(resolve,reject){
        setTimeout(function(){
            reject('Timeout!')
        },delay)
    })
}
Promise.race([
    foo(),
    timeout(3000)
]).then(
    function(){
        //foo(...)及时完成
    },
    function(err){
        //foo(...)被拒绝,或者没按时完成
    }
)

1.2.4调用次数过少或过多

调用次数过少就是没有调用

Promise解决

Promise只能进行一次决议,所以任何通过then(…)注册的回调都只会调用一次

1.2.5未传递参数、环境值

回调函数不知道处理那些数据,以及改怎么执行

Promise解决

如果你没有用任何值显式决议,默认用undefined代替

#### 1.2.6吞掉错误和异常

回调函数出现错误和异常时在某种情况下,不向外抛出提示

2.Promise的几个关键问题

2.1怎么改变Promise的状态

通过resolve()

resolve('ok');        // pending   => fulfilled (resolved)

通过reject()

reject("error");      // pending  =>  rejected

2.2Promise 指定多个回调

一个promise对象通过多个==.then()==调用

eg:

let p = new Promise((resolve, reject) => {
            // resolve('OK');
        });

        ///指定回调 - 1
        p.then(value => {
            console.log(value);
        });

        //指定回调 - 2
        p.then(value => {
            alert(value);
        });

结果是可以的

会先出现alert()弹框,后控制台打印

2.3Promise 改变状态与指定回调的顺序问题

都有可能一般先指定回调后改变状态

先改变状态后指定回调的方法如下,也可以通过reject()或resolve()

let p = new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve("OK");
        }, 2000);
      });

      p.then(
        (value) => {
          console.log(value);
        },
        (reason) => {
          console.log(reason);
        }
      );

2.4Promise.then方法的返回结果特点

如果执行then方法返回的是非Promise对象

新promise变为resolved, value为返回的值

let p = new Promise((resolve, reject) => {
            resolve('ok');
        });
let result = p.then(value => {
     console.log(value);
        //返回结果是非 Promise 类型的对象
      return 521;
          });
     }, reason => {
          console.warn(reason);
      });
console.log(result);

如果抛出异常, 新 promise 变为 rejected, reason 为抛出的异常

如果返回的是另一个新promise, 此promise的结果就会成为新promise的结果

let p = new Promise((resolve, reject) => {
        resolve("ok");
      });
//执行 then 方法
let result = p.then(
 (value) => {
    console.log(value);
     //3. 返回结果是 Promise 对象
return new Promise((resolve, reject) => {
     resolve('success');
     //reject('error');
  });
 },
 (reason) => {
      console.warn(reason);
     }
   );
 console.log(result);

2.5异常穿透

当使用 promise 的 then 链式调用时, 可以在最后指定失败的回调,
前面任何操作出了异常, 都会传到最后失败的回调中处理

let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('OK');
                // reject('Err');
            }, 1000);
        });

        p.then(value => {
            // console.log(111);
            throw '失败啦!';
        }).then(value => {
            console.log(222);
        }).then(value => {
            console.log(333);
        }).catch(reason => {
            console.warn(reason);
        });

总结:1.深入了解回调函数的一些问题
2.了解Promise怎么解决这些信任问题
3.了解了promise的特点

总结

到此这篇关于JS中promise特点与信任问题解决的文章就介绍到这了,更多相关JS promise信任问题内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScript Promise 用法

    同步编程通常来说易于调试和维护,然而,异步编程通常能获得更好的性能和更大的灵活性.异步的最大特点是无需等待."Promises"渐渐成为JavaScript里最重要的一部分,大量的新API都开始promise原理实现.下面让我们看一下什么是promise,以及它的API和用法! Promises现状 XMLHttpRequest API是异步的,但它没有使用promise API.但有很多原生的 javascript API 使用了promise: *Battery API *fetc

  • 浅谈js promise看这篇足够了

    一.背景 大家都知道nodejs很快,为什么会这么快呢,原因就是node采用异步回调的方式来处理需要等待的事件,使得代码会继续往下执行不用在某个地方等待着.但是也有一个不好的地方,当我们有很多回调的时候,比如这个回调执行完需要去执行下个回调,然后接着再执行下个回调,这样就会造成层层嵌套,代码不清晰,很容易进入"回调监狱",就容易造成下边的例子: async(1, function(value){ async(value, function(value){ async(value, fu

  • 理解JavaScript中Promise的使用

    Javascript 采用回调函数(callback)来处理异步编程.从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的回调金字塔(Pyramid of Doom),绝对是一种糟糕的编程体验.于是便有了 CommonJS 的 Promises/A 规范,用于解决回调金字塔问题.本文先介绍 Promises 相关规范,然后再通过解读一个迷你的 Promises 以加深理解. 什么是 Promise 一个 Promise 对象代表一个目前还不可用,但是在未来的

  • Javascript Promise用法详解

    1.约定 本文的 demo 代码有些是伪代码,不可以直接执行. 没有特殊说明,本文所有 demo 都是基于 ES6 规范. Object.method 代表是静态方法, Object#method 代表的是实例方法.如 Promise#then 代表的是 Promise 的实例方法, Promise.resolve 代表的是 Promise 的静态方法. 2.什么是 Promise? 首先我们来了解 Promise 到底是怎么一回事 Promise 是抽象的异步处理对象,以及对其进行各种操作的组

  • JavaScript中的Promise使用详解

    许多的语言,为了将异步模式处理得更像平常的顺序,都包含一种有趣的方案库,它们被称之为promises,deferreds,或者futures.JavaScript的promises ,可以促进关注点分离,以代替紧密耦合的接口. 本文讲的是基于Promises/A 标准的JavaScript promises.[http://wiki.commonjs.org/wiki/Promises/A] Promise的用例: 执行规则 多个远程验证 超时处理 远程数据请求 动画 将事件逻辑从应用逻辑中解耦

  • JS中promise特点与信任问题解决

    目录 1.Promise的信任问题 1.1信任问题 1.2信任问题产生的原因 1.2.1调用过早 1.2.2调用过晚 1.2.3回调未调用 1.2.4调用次数过少或过多 1.2.5未传递参数.环境值 #### 1.2.6吞掉错误和异常 2.Promise的几个关键问题 2.1怎么改变Promise的状态 2.2Promise 指定多个回调 2.3Promise 改变状态与指定回调的顺序问题 2.4Promise.then方法的返回结果特点 2.5异常穿透 总结 1.Promise的信任问题 1.

  • JS中promise化微信小程序api

    promise化的原因 微信小程序的api用的是对象参数回调模式,很容易造成回调地狱,代码难以阅读,判断,修改 和调试. 微信小程序api示例 // 获取用户信息 wx.getSetting({ success: res => { if (res.authSetting['scope.userInfo']) { // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框 wx.getUserInfo({ success: res => { // 可以将 res 发送给后台解码

  • JS中Promise函数then的奥秘探究

    Promise概述 Promise对象是CommonJS工作组提出的一种规范,目的是为异步操作提供统一接口. 那么,什么是Promises? 首先,它是一个对象,也就是说与其他JavaScript对象的用法,没有什么两样:其次,它起到代理作用(proxy),充当异步操作与回调函数之间的中介.它使得异步操作具备同步操作的接口,使得程序具备正常的同步运行的流程,回调函数不必再一层层嵌套. 简单说,它的思想是,每一个异步任务立刻返回一个Promise对象,由于是立刻返回,所以可以采用同步操作的流程.这

  • JS 中使用Promise 实现红绿灯实例代码(demo)

    要求 使用promise 实现红绿灯颜色的跳转 绿灯执行三秒后 黄灯执行四秒后 红灯执行五秒 html 实现如下: <ul id="traffic" class=""> <li id="green"></li> <li id="yellow"></li> <li id="red"></li> </ul> 定义一个

  • JS 调试中常见的报错问题解决方法

    报错:Uncaught SyntaxError: Unexpected token o in JSON at position 1 at JSON.parse (<anonymous>) at Function.m.parseJSON (jquery.js:8515) at Object.success (crud.html:45) at j (jquery.js:3143) at Object.fireWith [as resolveWith] (jquery.js:3255) at x (

  • 如何将Node.js中的回调转换为Promise

    前言 在几年前,回调是 JavaScript 中实现执行异步代码的唯一方法.回调本身几乎没有什么问题,最值得注意的是"回调地狱". 在 ES6 中引入了 Promise 作为这些问题的解决方案.最后通过引入   async/await 关键字来提供更好的体验并提高了可读性. 即使有了新的方法,但是仍然有许多使用回调的原生模块和库.在本文中,我们将讨论如何将 JavaScript 回调转换为 Promise.ES6 的知识将会派上用场,因为我们将会使用 展开操作符之类的功能来简化要做的事

  • Node.js中ES6模块化及Promise对象

    目录 ES6模块化 CommonJS 规范 模块化开发好处 模块化规范划分 ES6模块化开发注意点 ES6 导入导出 Promise对象 使用语法 Promise中的同步异步 Promise 封装 第三方then-fs解决回调地狱 ES6模块化 CommonJS 规范 node.js 遵循了 CommonJS 的模块化规范.其中: 导入其它模块使用 require()方法 模块对外共享成员使用 module.exports 对象 模块化开发好处 模块化开发的好处有很多,其中: 实现了在JS文件中

  • vue.config.js中devServer.proxy配置说明及配置正确不生效问题解决

    目录 proxy 配置确认.解析 原因 一 原因二 注意 详解 pathRewrite changeOrigin 总结 proxy 配置确认.解析 devServer: { https: true, // 开启https模式 // 配置服务器代理 proxy: { '/api': { // 匹配访问路径中含有 '/api' 的路径 target: 'http://localhost:3000/', // 测试地址.目标地址 changeOrigin: true, ws: true, // 是否开

  • 深入理解JS中的Promise.race控制并发量

    目录 开篇 一.Promise.race 二.并发效果展示 三.代码 总结与思考 开篇 比如在开发中会进行一系列的网络请求,但是有些情况需要控制一下网络请求请并发量.这里简单的用 Promise.race 及 await 的特性来理解一下,如何对任务的并发量进行控制. 一.Promise.race Promise.race 作用就是将多个异步任务包裹起来,当有一个完成的话,那么就会触发 then 事件.除了这个不错的特性方法外,await 这个关键字也比较有用,可以这样理解,await 后面的代

  • JS前端常见的竞态问题解决方法详解

    目录 什么是竞态问题 取消过期请求 XMLHttpRequest 取消请求 fetch API 取消请求 axios 取消请求 可取消的 promise 忽略过期请求 封装指令式 promise 使用唯一 id 标识每次请求 「取消」和「忽略」的比较 「取消」更实际 「忽略」更通用 总结 什么是竞态问题 竞态问题,又叫竞态条件(race condition),它旨在描述一个系统或者进程的输出依赖于不受控制的事件出现顺序或者出现时机. 此词源自于两个信号试着彼此竞争,来影响谁先输出. 简单来说,竞

随机推荐