Promise对象

javascript学习——Promise 对象 Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口。它起到代理作用(proxy),充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接口。Promise 可以让异步操作写起来,就像在写同步操作的流程,而不必一层层地嵌套回调函数。首先,Promise 是一个对象,也是一个构造函数。上面代码中,Promise构造函数接受一个回调函数f1作为参数,f1里面是异步操作的代码。然后,返回的p1就是一个 Promise 实例。 阅读详情

1、promise概念

* Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。

* 简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

* 从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

2、promise特点

有且只有这两种,而且一个peomise对象只能改变一次,无论变为成功还是失败,都会有一个结果数据,成功的结果数据一般为value,失败的结果数据一般被称为reason

它只有两种状态(PromiseState)可以转化,即

- **操作成功:**pending -> fulfilled/resolved

- **操作失败:**pending -> rejected

实例对象的值:PromiseResult。该对象保存的结果为异步任务成功和失败的结果

* 成功的结果 resolve 

* 失败的结果 rejected

promise有三个状态:

1、pending[待定]初始状态

2、fulfilled[实现]操作成功

3、rejected[被否决]操作失败

resolve作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

reject作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

3、promise实现原理

ES6 规定,`Promise` 对象是一个构造函数,用来生成 `Promise` 实例。通过在函数内部 return 一个 `Promise` 对象的实例,这样就可以使用 `Promise` 的属性和方法进行下一步操作了。

```javascript

Promise 构造函数接受一个函数作为参数,该函数的两个参数分别是 resolve 和 reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署

promise的方法:`then()`方法就是把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数.

而 `Promise`的优势就在于这个链式调用。我们可以在 then 方法中继续写 `Promise` 对象并返回,然后继续调用 `then` 来进行回调操作。

问题一:函数内部的异步函数

怎样才能取得到函数内部的data

```

```javascript

1、promise构造函数的参数是个函数

2、该函数的参数有两个:resolve,reject

  resolve:异步操作成功,要调用的函数。是then函数的第一个参数

  reject表示操作失败,要调用的时候是then函数的第二个参数

```4、promise的api方法

4.1、**.then(callback)**

Promise对象含有then方法,then()调用后返回一个Promise对象,意味着实例化后的Promise对象可以进行链式调用,而且这个then()方法可以接收两个函数,一个是处理成功后的函数,一个是处理错误结果的函数。

var promise1 = new Promise(function(resolve, reject) {

  // 2秒后置为接收状态

  setTimeout(function() {

    resolve('success');

  }, 2000);

});

promise1.then(function(data) {

  console.log(data); success

}, function(err) {

  console.log(err); // 不执行

}).then(function(data) {

  // 上一步的then()方法没有返回值

  console.log('链式调用:' + data); // 链式调用:undefined 

}).then(function(data) {

  // ....

});

4.2、**.catch(callback)**

catch()方法和then()方法一样,都会返回一个新的Promise对象,它主要用于捕获异步操作时出现的异常。因此,我们通常省略then()方法的第二个参数,把错误处理控制权转交给其后面的catch()函数

```javascript

const p = new Promise((resolve, reject) => {

            //  修改p的状态

    reject('失败')

})

console.log(p);

p.catch(data => {

    console.log(data);

})

4.3、**.all()**

Promise.all()  

Promise包含n个promise的数组,说明:返回一个新的promise,只有promise都成功才成功,只要有一个失败了,就都失败

```javascript

 const p1 = new Promise((resolve, reject) => {

     resolve('ok')

 })

 const p2 = new Promise((resolve, reject) => {

     resolve('okhaha')

 })

 const p3 = new Promise((resolve, reject) => {

     resolve('kobab')

 })

 const result = Promise.all([p1,p2,p3]);

console.log(result);

4.4  .race()

 Promise包含n个promise的数组,说明:返回一个promise,第一个完成的promise的结果状态就是最终的结果状态

```javascript

 const p1 = new Promise((resolve, reject) => {

     resolve('ok')

 })

 const p2 = new Promise((resolve, reject) => {

     resolve('jj')

 })

 const p3 = new Promise((resolve, reject) => {

     resolve('ll')

 })

 const result = Promise.race([p1,p2,p3]);

console.log(result);

```
 5、promise封装ajax

```javascript


 

```

 async 和await

```javascript

async 函数   await 后跟着一个promise对象

async function getData(){

    let hotpot = await getHotpot(); //拿到resolve传递出来的数据

    console.log(hotpot);

    let tea = await getTea();

    consloe.log(tea);

}

getData();

一.ajax的同源策略

Ajax请求限制:

Ajax 只能向自己的服务器发送请求。比如现在有一个A网站、有一个B网站,A网站中的 HTML 文件只能向A网站服务器中发送 Ajax 请求,B网站中的 HTML 文件只能向 B 网站中发送 Ajax 请求,但是 A 网站是不能向 B 网站发送 Ajax请求的,同理,B 网站也不能向 A 网站发送 Ajax请求。

**什么叫同源策略**

同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源

**同源策略的目的**

同源策略是为了保证用户信息的安全,防止恶意的网站窃取数据。最初的同源政策是指 A 网站在客户端设置的 Cookie,B网站是不能访问的。

随着互联网的发展,同源政策也越来越严格,在不同源的情况下,其中有一项规定就是无法向非同源地址发送Ajax 请求,如果请求,浏览器就会报错。


二.jsonp跨域

##### 使用JSONP解决同源限制问题

jsonp的原理:页面上的很多标签比如src,href,都不会受到同源策略的影响

有一些标签天生就有跨域能力,比如:img,link,iframe,script

jsonp就是利用`<script>`的src来实现跨域获取数据的,只支持get请求

jsonp 由两部分组成:回调函数和数据,回调函数是当响应到来时应该在页面中调用的函数。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的 JSON 数据

jsonp 是 json with padding 的缩写,它不属于 Ajax 请求,但它可以模拟 Ajax 请求。

1. 将不同源的服务器端请求地址写在 script 标签的 src 属性中

   ```javascript

    <script src="www.example.com"></script>

   ```

2. 服务器端响应数据必须是一个函数的调用,真正要发送给客户端的数据需要作为函数调用的参数。

   ```javascript

    const data = 'fn({name: "张三", age: "20"})';

    echo data;

   ```

3. 在客户端全局作用域

   ```javascript

   function fn(data){}

   ```

4. 在fn函数内部对服务器端返回的数据进行处理

   ```javascript

   function fn(data){

       console.log(data);

   }

   ```

整体实现思路:

1. 客户端需要将函数名称传递到服务器端

2. 将script请求的发送变成动态的请求。

```javascript

 <script>

  function fn(data){

     console.log(data);

 }

//  接收后端响应的数据

</script>

<script src="data.php?callback=fn"></script>

```

​    后端:

```javascript

<?php

    $cb = $_GET['callback']; //接收前端的参数:callback  fn

    $data = "i am back";

    echo $cb.'("'.$data.'")'; // fn('123')

?>

    

    echo '字符串'

```

高级版实现:

```javascript

 <script>

        function fn1(data) {

            console.log('客户端的fn函数被调用了');

            console.log(data);

        }

        function add(){

            // 创建srcipt标签

            var oSrc = document.createElement('script');

            oSrc.src = 'http://192.168.52.1/workspace/demo/code3/data.php?callback=fn1';

            document.body.appendChild(oSrc);

            // 监听script标签什么时间加载完成,

            oSrc.onload = function(){

                oSrc.remove();

            }

        }

    </script>

``

高级封装

```javascript

1. 客户端需要将函数名称传递到服务器端

2. 将script请求的发送变成动态请求

3. 封装jsonp函数,方便请求发送

```

  ```javascript

 <script>

        function add() {

            jsonp({

                url: 'http://192.168.52.1/workspace/data.php',

                data:{},

                success:function(data){

                    console.log(data);

                }

            })

        }

        function jsonp(options) {

            var script = document.createElement('script');

            var fn = 'myscript'+Math.random().toString().replace('.','');

            window[fn]=options.success;

            script.src = options.url+'?callback='+fn+getParams(options.data);

            document.body.appendChild(script);

            // 监听script标签什么时间加载完成,

            script.onload = function () {

                script.remove();

            }

        }

        function getParams(obj){

            var arr = [];

            for(var k in obj){

                  arr.push(k+'='+obj[k]);

            }

            return arr;

        }

    </script>

三.服务器端跨域

CORS:全称为 Cross-origin resource sharing,即跨域资源共享,它允许浏览器向跨域服务器发送 Ajax 请求,克服了 Ajax 只能同源使用的限制。

前端请求地址:

```javascript

http://192.168.52.1/workspace/day05/cros.php

```

后端设置:

```javascript

 Access-Control-Allow-Origin: 'http://localhost:3000'

 Access-Control-Allow-Origin: '*'

```

header(‘Access-Control-Allow-Origin: *’);

如果想设置只允许某个网站通过的话可以这样设置

header(’Access-Control-Allow-Origin: http://test.com‘); // 允许test.com发起的跨域请求,其他的都不通过

六. 请求天气预报

接口文档:

```javascript

      请求方式:GET     

      请求地址: 'https://wis.qq.com/weather/common',

     必要参数:

         province: "陕西省",

         city: "西安市",

         source:'pc',

         weather_type:'forecast_1h'

搜索框自动搜索

```javascript

<!DOCTYPE html>

<html>

<head>

    <title></title>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">

</head>

<body>

    <input type="text">

    <script src="./jsonp.js"></script>

    <script>

        

        var oTxt = document.querySelector('input')

        oTxt.oninput = function () {

            jsonp({

                type:'GET',

                url: 'https://suggest.taobao.com/sug',

                data: {

                    q: this.value,

                },

                success: function (data) {

                    console.log(data);

                }

            })

        }

    </script>

</body>

</html>

对Promise的理解以及Promise的基本用法 一、理解Promise ① 定义 ② 优点 ③ 特点 ④ 缺点 二、Promise基本用法 ① resolve函数的作用 ② reject函数的作用 ③ then方法 ④一个异步加载图片的例子 三、Promise的其他常见方法 ①Promise.prototype.then() ②Promise.prototype.catch() ③Promise.prototype.finally() ④Promise.all() ⑤Promise.race() 四、 阅读详情

相关推荐

【JavaScript 漫游】【054】Promise 对象

本篇文章为【JavaScript 漫游】专栏的第 054 篇文章,记录 Promise 对象的知识点。

CYW2019_HUST的博客 1375

ES6中Promise用法及理解

ES6中Promise用法及理解 promise就是个构造函数,参数为一个函数 构造函数一般使用其实例进行操作,如何得到一个构造函数的实例呢? 1、new Promise(参数:函数); 2、参数为一个函数,这个函数同样也有两个参数 resolve reject,这两个参数也是函数 resolve执行后返回promise的成功状态, reject执行后返回promise的错误状态 基本使用形式: var p = new Promise(function(resolve,reject){

weixin_46995731的博客 1756

JavaScript之Promise对象

Promise 对象是一个代理对象(代理一个值),被代理的值在 Promise 对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers)。 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的 Promise 对象。 Promise 对象有以下两个特点: 对象的状态不受外界影响。Promise 对...

weixin_40589919的博客 1063

Promise详细讲解

在正式学习promise之前,建议先了解一下回调地狱的概念回调函数中再传入一个函数,形成了回调函数的嵌套,这种情况叫做回调地狱,举个例子:由于他们都是异步,只有采用嵌套的形式才能确保他们按照顺序执行,最终输入结果为1, 2,3.回调地狱代码存在一下几个缺点:1:代码可复用性差2:可阅读性差3:可维护性(迭代性差),嵌套函数存在耦合性,一旦有所改动,就会牵一发而动全身。

美女的博客 6126

Promise 最完整介绍与实现解密

在 JavaScript Promise 快速入门 这一篇对Promise 及其基本用法做了简单的介绍。本篇介绍Promise 的完整功能以及对Promise 的来源以及实现进行解密。 Promise 是什么? 该怎么解释Promise 呢? 试着从以下几种角度来理解: 从代码的角度: Promise 是ECMAScript 6中提供了一个类 ,Promise 对象可以让异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数的方式。 从Promise工作机制的角度:Promise 表示一个异步操作

oscar999的专栏 1149

【QGIS】利用“创建网格”功能实现区域等距分割与坐标转换实战

本文详细介绍了如何在QGIS中使用“创建网格”工具实现区域等距分割。通过实战演示,将北京市行政区划切割为150米正方形网格,并重点讲解了关键步骤:选择投影坐标系EPSG:3857以确保网格尺寸精确,以及将结果转换为常用的WGS84经纬度坐标。文章还涵盖了进阶技巧与常见问题解决方案,帮助用户高效完成空间网格化分析任务。

weixin_29232507的博客 95

Promise 详解(原理篇)

Promise 是一种异步编程的解决方案。在异步操作中,callback 会导致回调地狱的问题,Promise 解决了这个问题。一个 Promise对象有以下三种状态:pending:初始状态,既不是成功,也不是失败状态。:意味着操作成功完成。rejected:意味着操作失败。当 new Promise() 被实例化后,即表示 Promise 进入 pending 初始化状态,准备就绪,等待运行。

When you can't win by being better, you can win by being different. 6987

Markdown编辑器介绍

这篇文章介绍了Markdown编辑器的功能和使用方法。主要内容包括:Markdown的基本语法如标题、列表、链接插入等;新增功能如图片拖拽、数学公式支持、甘特图和UML图表绘制;常用快捷键说明;以及文本导出导入操作。文章详细说明了如何通过Markdown语法实现文本格式化、代码高亮、表格创建等功能,并提供了多种图表绘制的语法示例,帮助用户更好地利用Markdown编辑器进行写作和内容创作。

soso1968的博客 1181

如何封装Promise对象?

可以参考promise规范Promise/A+ 如何封装一个简易的promise对象?废话不多说,直接上代码 <script> class MyPromise { constructor(executor) { // 初始化state赋值为pending this.state = "pending"; // 定义成功的 值 this.value = undefined; //定义失败的

l_XIANA的博客 1189

第三方系统(异构系统)基于token身份认证方式访问Ecology9的Restful接口Ecology9服务器配置部分

通过Token的认证方式调用Ecology9系统Restful业务接口服务器配置部分

svsou的专栏 2175

YOLOv11+SAHI实战:5步搞定无人机航拍小目标检测(附VisDrone数据集调参技巧)

本文详细介绍了如何结合YOLOv11目标检测框架与SAHI切片推理技术,高效解决无人机航拍图像中的小目标检测难题。通过VisDrone数据集调参技巧和5步实战指南,帮助开发者快速构建高性能检测系统,显著提升小目标检测的准确率和效率。

rum55的博客 190

Promise 对象

JavaScript 是一个单线程的编程语言,通过异步、回调函数来处理各种事件

zhuge_long的专栏 950

python123题目——个税计算器

类型:简单分支。

m0_62488776的博客 5803

js promise对象

promise对象是javaScript的异步操作解决方案,,为异步操作提供统一的接口。它起到代理的作用(proxy),充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接口。Promise可以让异步操作写起来,就像在写同步操作的流程,而不必一层层的嵌套回调函数。 Promise的设计思想是,所有异步任务都返回一个Promise实例,Promise实例有一个then方法,用来指定下一步...

记录点滴 570

化工热力学软件:Aspen Plus二次开发_(9).过程控制与动态模拟v1

Aspen Plus 提供了丰富的过程控制工具和方法,可以用于静态和动态过程的模拟和控制策略的开发。通过控制回路设计、动态模拟、优化工具和数据交换接口,用户可以设计和优化各种复杂的控制策略,提高化工生产的稳定性和效率。此外,结合外部软件(如MATLAB、Simulink、LabVIEW等),可以实现更高级的控制策略,如自适应控制和模型预测控制,进一步提升过程控制的精度和灵活性。希望本文的内容能帮助用户更好地理解和应用Aspen Plus中的过程控制功能。

kkchenjj的博客 405

从 Token 到 Agent:一文串起 AI 大模型核心概念

摘要:本文系统解析了现代AI系统的八大核心概念:Token(语言处理的最小单位)、Context(AI的短期记忆)、Prompt(指令接口)、Tool(能力扩展器)、MCP(工具生态协议)、Agent(自主智能体)和AgentSkill(专业技能封装)。文章揭示了这些概念如何共同构成AI从基础语言理解到自主决策的技术脉络,重点阐述了Token对计算成本的影响、Prompt工程的重要性、Tool如何突破AI的能力边界,以及Agent如何通过"感知-规划-执行-反思"循环完成复杂任务。最后指

jundao1997的专栏 250

JavaScript 的 Promise 对象和 Promise.all 方法的使用

本文讲解Promise 对象和 Promise.all 方法管理多个并发的异步操作,并确保只有在所有操作都成功的情况下才继续下一步骤

m0_72030584的博客 900

用 MVC 框架把 ABAP 报表写成可扩展的应用(2)

本文介绍了一个基于MVC架构的SAP报表模板,解决了传统ABAP报表开发中的三个核心痛点: 选择屏幕校验逻辑分散问题 - 通过统一的选择屏幕控制器集中管理校验逻辑 在线与后台输出不一致问题 - 共享同一数据模型,通过不同控制器实现多样化展示 屏幕流转管理混乱问题 - 主控制器统一管理所有屏幕流程和事件 该模板采用分层架构: Model层专注数据获取和业务规则 Controller层管理流程和交互 View层负责展示逻辑 特别适用于需要同时支持交互式ALV展示和后台批处理输出的报表场景,通过标准化的扩展点设计

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 78

promise对象

promise是一个对象,从它可以获取异步操作的消息 promise状态 异步操作有三种状态:pending(进行中),fulfilled(已成功),rejected(已失败) 状态改变,只可以pending-->fulfilled, pending-->rejected变化;只有处于fulfilled,rejected,状态就不会变化了,即resolved(已定型) 状态的缺点 ...

qq_43638735的博客 1513

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: 流程控制语句的分类
下一篇: cookie
Wave_explosion
博客等级 码龄5年 4粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值