基于Node的Promise使用介绍

51 篇文章 1 订阅
订阅专栏

异步操作常见语法:

(1)基于事件的监听机制,常见的如在dom节点上绑定click、blur等事件:

 

(2)基于回调。先调用外部函数,例如下面的$.ajax,然后再传入一个回调函数,当外部函数执行完毕后,回调函数就会被触发

 

promise产生的原因

(1)解决同步问题
(2)解决无穷回调

在浏览器中,异步操作主要以事件为主,回调请求一般出现在网络请求或文件API中。

当node.js出现后,对于异步的依赖进一步加剧,因为Node的招牌就是无阻塞高并发,自然而然异步操作就是这一特性的重要保障。

当node.js接受一个用户请求之后,若此请求中包含了耗时的数据库操作,那么node在发起数据库操作之后,会暂时讲用户请求挂起,并继续接收请他请求(高并发),当数据库运行完毕返回结果后,之前挂起的请求就会重新被唤醒,接着后续的操作。

在上述过程中,会大量依赖回调函数。当业务逻辑复杂时,就会陷入无穷回调的窘境里:

 

这样的代码在可阅读性和维护性上都极差

异步回调的问题

(1)嵌套层次深,难以维护

(2)无法正常的使用return和throw。由于回调函数和外部函数不处于用一个的执行栈,所以常规的try/catch 方法没有办法捕获到回调函数中的异常,只能通过return callback(err)的方法返回错误

(3)定义的全局变量在回调函数中的状态不确定,尤其是当同一个全局变量存在于多个回调函数中时,由于回调函数触发的时机不可控,就导致了此全局变量变化不可控的情况。

promise简介

在使用promise的时候,首先要初始化一个promise实例,需要向里面传入一个参数(函数),此函数称为执行器。执行器里传入了两个参数——resolve和reject。我们可以把耗时很长的操作放在执行器里执行。当数据执行完毕且正确时,就会调用resolve()方法,如果执行错误,就会调用reject方法。

当这两个函数执行完毕后,就会去改变promise的状态,紧接着就会去调用then函数里的两个处理函数。若执行器调用了resolve函数,则then里第一个参数函数被回调;若执行器执行了reject方法,则then里第二个参数函数被回调

promise详解

以上,promise只是一个代理对象,它和原先要进行的操作并无关系,同时它只引入了一个回调,避免更多的回调,可以以此把其他回调展开,变成基于promise的回调

promise状态

(1)pending[待定]初始状态:实例化之后的状态

(2)fulfilled[实现]操作成功:当执行完毕后,调用resolve时

(3)rejected[被否决]:操作失败

当promise状态发生改变后,就会触发.then()里得到的响应函数处理后续步骤。当promise状态改版后就不会再改变了。

最简单的范例

两步定时执行:

 

console.log('here we go');
new Promise( resolve => {
    setTimeout( () => {
        resolve('hello');
    }, 2000);
})
    .then( value => {
        console.log(value);
        return new Promise( resolve => {
            setTimeout( () => {
                resolve('world');
            }, 2000);
        });
    })
    .then( value => {
        console.log( value + ' world');
    });

此例子是演示的promise最常用从场景——多次回调

对已完成的promise进行then操作

 


console.log('start');

let promise = new Promise(resolve => {
    setTimeout(() => {
        console.log('the promise fulfilled');
        resolve('hello, world');
    }, 1000);
});

setTimeout(() => {
    promise.then( value => {
        console.log(value);
    });
}, 3000);

此例子展示了promise作为队列的特性——我们在任何地方生成了一个promise队列之后,我们可以把它作为一个变量传递到其他地方

如果在promise中不返回新的promise

 

console.log('here we go');
new Promise(resolve => {
    setTimeout( () => {
        resolve('hello');
    }, 2000);
})
    .then( value => {
        console.log(value);
        console.log('everyone');
        (function () {
            return new Promise(resolve => {
                setTimeout(() => {
                    console.log('Mr.Laurence');
                    resolve('Merry Xmas');
                }, 2000);
            });
        }());
        return false;
    })
    .then( value => {
        console.log(value + ' world');
    });

最终返回:

 

本例中在第一个then里没有返回一个新的值,而是返回了一个立即执行的函数,在此自执行函数里返回了一个promise。最外层的promise不会等待里面的自执行函数,而是会在return false的作用下立即调用.then,此时then里的value就对应‘false’。

.then()

说明

  • .then()接受两个函数作为参数,分表代表fulfilled状态下响应函数和rejected状态下的响应函数。

  • 执行.then之后会返回一个新的promise实例,多以可以在.then继续进行链式调用 。

  • 当前面的promise状态改变时,.then根据其最终状态,选择特定的状态响应函数执行。如果

  • 状态响应函数可以返回新的promise,或其他值。

  • 如果返回新的promise,那么下一级.then()会在新promise状态改变之后执行。

  • 如果返回其他任何值,则会立即执行下一级.then()

.then()的嵌套

  • 因为.then()返回的还是promise的实例,所以会等里面的.then()执行完,再执行外面的。

测试

错误处理

当我们在catch中处理错误时,仍然会返回promise实例。

常用函数

promise.all()批量执行

.map()连用

把一组操作转化为promise集体的一个状态

实现队列

有时候我们不希望所有动作一起发生,而是按照一定顺序,逐个进行。

 

Promise.resolve

Promise.reject()

Promise.race()

把回调包装成promise

async/await


 

Node开发(六)Promise
weixin_43933148的博客
09-26 318
Promise是一种异步编程的解决方案。 现在经常使用回调函数来解决异步通信(传参)的问题,若回调函数层次过深,就会出现回调地狱问题(逻辑不够清晰,可维护性差) Promise是一个对象,通过new Promise来创建对象 1.创建Promise对象 1)Promise对象需要接收一个函数作为参数,这个作为参数的函数有两个参数,resolve,reject 2)resolve和reject本身也是函数 let p=new Promise((resolve,reject)=>{ }); P
node-promise-tools:使用Promises的工具
05-07
它是什么? 那里有很多不错的Promise库,例如和 ,并且还有很多方便的功能,它们超出了ECMAScript 2015标准中定义的一小部分标准功能。 但是,所有这些库都使您可以使用Promise的实现(因为自从Promises成为ECMAScript标准的一部分之前,它们就已经存在了),而且它们中的大多数都具有很大的优势(蓝鸟时钟几乎达到166k,未缩小)。 promise-tools的目标是提供一个的函数的小型库,以及一些其他方便的函数,并使您可以在任何Promise实现的顶部使用这些函数。 (此外,如果您正在编写一个库,并且希望使调用者可以轻松使用Promises或callbacks,请确保签出 )。 安装 npm install --save promise-tools 要求 该库假定Promise是已定义的全局变量。 如果在您的平台上不是这种情况,则可以使用polyfill
node Promise使用
IT_iosers的博客
07-05 210
const fs = require('fs') const path = require('path') let filePath = path.join(__dirname, '11.txt') // then链式调用的特点: // 1、第一个then执行完毕后(不管成功还是失败)会执行第二个then里函数的代码 // 2、then的函数里面可以有返回值。被下一个then的形参接收 // 3、(最重要的一个) 如果返回的是一个Promise对象,下一个then的形参接收到的不是这个Promi
详细介绍Node.js中Promise对象的基本用法
Web+
05-09 2428
什么是PromisePromise是一个构造函数,方法有all、reject、resolve这几个,原型上有then、catch等方法。那么new Promise 出来的对象肯定就有then、catch方法。 让我们new一个吧: var promise = new Promise(function(resolve, reject) { //异步操作 setTimeout(fu...
如何在Node使用Promise
Welkin_qing的博客
10-27 365
如何在Node使用Promise
Node使用promise
weixin_33912638的博客
04-19 1389
promise的构造函数的写法模式:var promise = new Promise((resolve,reject)=>{ if(true){ resolve(value); }else{ reject(error) } } )复制代码在业务中经常会有上传文件和下载文件的业务需求,这时候就会用到node中的读文件和写文件,用promise来封装一个rea...
axios:基于Promise的HTTP客户端,用于浏览器和node.js
05-11
基于Promise的HTTP客户端,用于浏览器和node.js 新的axios docs网站: 目录 特征 从浏览器发出 从node.js发出请求 支持 API 拦截请求和响应 转换请求和响应数据 取消请求 JSON数据的自动转换 客户端支持以防 ...
基于Promise的HTTP客户端,用于浏览器和node.js-Node.js开发
05-27
针对浏览器和node.js的基于axios Promise的HTTP客户端功能通过浏览器进行XMLHttpRequest的响应来自node.js的http请求支持Promise API拦截请求和响应Tra基于浏览器和node.js的基于axios Promise的HTTP客户端功能使...
node-mysql-promise
04-12
node mysql操作封装类,基于promise,借鉴75team开源项目thinkjs中model操作,数据库连接使用node-mysql的连接池。 使用示例 var Mysql = require('node-mysql-promise'); var mysql = Mysql.createConnection({ ...
Node.js-axios基于Promise的HTTP客户端用于浏览器和node.js
08-09
axios:基于Promise的HTTP客户端,用于浏览器和node.js
axios:用于浏览器和node.js的基于Promise的HTTP客户端
02-03
轴距 基于Promise的HTTP客户端,用于浏览器和node.js目录产品特点从浏览器发出 从node.js发出请求支持 API 拦截请求和响应转换请求和响应数据取消请求JSON数据的自动转换客户端支持以防浏览器支持 最新 :heavy_check...
nodejs_promise用法
m0_53077733的博客
04-18 4131
nodejs_promise用法 ​ 在使用promise之前,首先了解js的运行环境是单线程的,必须按照’流水线’的方式来工作,如果有多个任务就得排队。 promise可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,promise对象提供统一的接口,使得控制异步操作更加容易。 (promise就是为了) ​ promise无法取消,一旦建立就会立即执行,无法中途取消。而且,如果不设置回调函数,promise内部抛出的错误不会反映到外部。当处于Pending(adj.待定的,
Promise用法和理解(Node篇)
一只前端小白的博客
12-09 932
解决问题:回调地狱(callback hell) 引用很经典的一张图,可以看出回调地狱带来的不友好的书写方式
promise
CrystalLee
09-05 652
一、含义 Promise对象有以下两个特点。 (1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。 (2)一旦状态改变,就...
nodePromise使用
Wollens Blogs
07-27 1101
nodePromise使用实例 需求:现有三个文件需要依次读取文件内容 // a.json { "next": "b.json", "massage": "this is a file content" } b.json { "next": "c.json", "massage": "this b file content" } c.json { "n...
Node,js 中的Promise
qq_26587333的博客
01-27 299
Javascript的特点是异步,Javascript不能等待,如果你实现某件需要等待的事情,你不能停在那里一直等待结果回来,相反,底线是使用回调callback:你定义一个函数,这个函数只有等到结果可用时才能被调用。  这种回调模型对于好的代码组织是没有问题的,但是也可以通过从原始回调切换到promise解决很多问题,将promise看成是一个标准的数据容器,这样会简化你的代码组织,可以成为基
node.js Promise简单介绍
weixin_43903378的博客
06-10 377
转自百度: https://baijiahao.baidu.com/s?id=1589455136001194151&wfr=spider&for=pc
nodejs使用Promise
Cherish
03-18 3474
Promise是异步操作对象,可以返回成功或失败。 创建一个Promise: new Promise(function(resove, reject){ resove('a'); }) // 也可以写成 const promise = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'foo'); }); // 或者 const promise1 = Promise.resove(1); // 或者 const promi
nodejs - Promise 用法与面试题分析
zone_的博客
01-21 1540
这是新年的第一篇技术文,加油干。这是一篇整合型文章,多出参考了其他文章,文末给出出处。 是的,和标题一样,我这边是面向 nodejs 后端,而不是面向前端写的,所以会以后端的想法去写。 什么是 Promise Promise 库是用来处理异步操作的,由于好用且强大,ES6 原生提供了 PromisePromise 有三种状态: pending(进行中) fulfilled(已成功)
Axios 是一个用于浏览器和 Node.js 的基于 Promise 的 HTTP 客户端其中Promise
最新发布
05-12
Axios可以在浏览器和Node.js环境中发送HTTP请求,并且支持Promise API,也可以拦截请求和响应、转换请求数据和响应数据等。Axios的使用相对简单,可以通过创建一个axios实例来配置默认的请求选项,然后使用该实例...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • uni-app swiper设置自定义高度 9063
  • failed: Error during WebSocket handshake: Unexpected response code: 404 8129
  • 前端播放rtmp协议的视频流文件 7647
  • vue @load 6208
  • 前端postMessage和addEventListener踩坑 5292

分类专栏

  • 前端高级 46篇
  • HTML 12篇
  • 前端插件库 7篇
  • 个人开发笔记 7篇
  • 前端技术文档 9篇
  • 前端性能优化 1篇
  • 前端练习 12篇
  • 移动web开发 7篇
  • 小程序 2篇
  • uni-app 1篇
  • MongDB 2篇
  • React 5篇
  • Vue 43篇
  • git 3篇
  • 开发工具 8篇
  • Javascript 11篇
  • node 51篇
  • Mysql 7篇
  • TypeScript 1篇
  • Redis 4篇
  • RESTful/微服务 2篇
  • APIdoc 1篇
  • Nginx 6篇
  • Laravel 19篇
  • PHP 32篇
  • Android开发
  • webpack 1篇
  • gulp 1篇
  • 编程辅助 2篇
  • Linux 2篇

最新评论

  • pc网页唤起QQ、企业微信、skype、whatsApp等

    qq_45970903: uin=账号是什么啊?

  • 前端播放rtmp协议的视频流文件

    仗剑天涯,从摘要开始: 为什么要用flash???

  • 前端播放rtmp协议的视频流文件

    weixin_45832212: 现在谷歌已经不支持flash了,用不了了

  • WEB请求处理二:Nginx请求反向代理

    m0_69875122: 讲的好,加油

  • js ~~ 或 + 把各类型转换成数字的两种方法

    今天学前端了吗?: 把空格写了就不报错了 1 + +a

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 111
  • 使用 vue-i18n 切换中英文
  • 用HTML5里的window.postMessage在两个网页间传递数据
2020年204篇
2019年77篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

聚圣源起名称姓名神界危机密码氵字旁的哪些字起名字好6月出生的鼠宝宝起名镇魂在线观看男孩起乳名贝贝寓意曲姓起名起名字女孩带火字旁化妆品成分搞笑一家人百度影音关于爱国的古诗家庭出身是什么朋友的妈妈2嘟嘟语音给属虎宝宝起名应注意哪些薛起名男宝名字陈柏宇发型瑜伽馆起名辛亥大英雄玉楼春电视剧全集免费观看贝索斯身价创福布斯纪录7月1给姓杨的宝宝起名的企业起名1518沁起名字工程公司起名带润济南车管所陪你逐风飞翔在线观看祸乱花丛出水芙蓉是什么意思淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化