对promise的理解

前言

在公众号的开发里面用的const Promise = require(‘bluebird‘);const request = Promise.promisify(require(‘request‘));这两句代码,之前一直没弄明白是啥意思,后来发现这是将callback函数重新用promise来实现。

什么是 promisify和promisifyall

promisify 就是把带有 callback 函数,变成重新用 promise 来实现的一种技术方案,它能一劳永逸的解决:如何把函数都用 promise 重新实现的问题。

如果说 promisify 只能一次转一个函数,那 promisifyall 的作用就是一次把一个库的文件转完。

怎么使用

const Promise = require(‘bluebird‘);

const **= Promise.promisify(require(‘**‘));

promisify

prmoisify的作是:将一个 nodeCallback 形式函数调用转为 promise

这里需要解释一下: nodeCallback 是什么意思。

nodeCallbackNodejs 中的一个常用词。表达是意思是:Nodejs 中,以错误优先的回调函数的总称。

它包括两个意思:

  1. nodeCallback 回调函数签名。
  2. nodeCallBack 回调函数出现的位置。

nodeCallback 签名

该回调函数的签名__一定__是这样:

// 这样是对的
function fooCallBack(err, a, b){
  // something
  console.log(a,b);
}

// 这样不对
function foo1CallBack(a,b,err){

}可以看到,fooCallBack 函数的调用参数中,第一个参数是: err, 也就是说的 noodeCallBack 函数的第一个参数__一定__传入的是 err ,而不能是别的参数。只要满足了这个条件,都可叫 nodeCallback

nodeCallBack 出现的顺序

nodeCallBack 一定出现在异步函数的最后一个,也就是这样:

// 这样是对的。
function foo(a,b,nodeCallback){
  // pass
}

// 这样就不是 nodeCallback
function foo(a,nodeCallback,b){
  // pass
}

只要满足了签名和顺序,就可以叫做 nodeCallBack

nodeCallback 存在哪里呢?告诉你吧,所有的 NodeJS 标准包中异步的地方都是它。

好了说了这么多 nodeCallback,现在来说说 promosify 怎样使用:

const Promise = require(‘bluebird‘);
const fs = require(‘fs‘);

// 回调形式,这里的callback 就是 nodeCallback
fs.readFile(‘./test.js‘,function(err,data){
  console.log(data);
});

// promisify 形式
const readFileAsync = Promise.promisify(fs.readFile);

readFileAsync(‘./test.js‘).then(function(data){
  console.log(data);
}).catch(console.log);

很简单吧。具体实现就不说了,想要了解的去 google 吧。

promisifyall

如果说 promisify 只能一次转一个函数,那 promisifyall 的作用就是一次把一个库的文件转完。

说的更清楚一点,promisifyall 能把一个库中有函数全部变成 promise 的形式,改变后的函数都带上了 Async 的后缀。看代码:

const Promise = require(‘bluebird‘);

const fs = Promise.promisifyall(require(‘fs‘));

fs.readFileAsync(‘./test.js‘).then(function(data){
  console.log(data);
}).catch(console.log);

从上面可以知道:fs 这个标准库,经过 promisifyall , 所有的函数都已经被 promise 化了。而被 promise 化的函数名变成了:原来的函数名+Async

结论

当学会使用 promisify 和 promisifyall 这两个方法,我相信大家以后都对:如何把函数都用promise方式实现? 这样的问题胸有成竹了吧。

参考博客:https://cnodejs.org/topic/576f9b5dd3baaf401780bba2

原文地址:https://www.cnblogs.com/TomAndJerry/p/9407331.html

时间: 2024-10-23 04:35:08

对promise的理解的相关文章

从源码看 Promise 概念与实现

Promise 是 JS 异步编程中的重要概念,它较好地解决了异步任务中回调嵌套的问题.在没有引入新的语言机制的前提下,这是如何实现的呢?上手 Promise 时常见若干晦涩的 API 与概念,它们又为什么存在呢?源码里隐藏着这些问题的答案. 下文会在介绍 Promise 概念的基础上,以一步步代码实现 Promise 的方式,解析 Promise 的实现机制.相应代码参考来自 PromiseJS 博客 及 You don't know JS 的若干章节. Why Promise (有使用 Pr

Promise (1) 初步接触

总想着王者荣耀排位赛再提升个等级就弃掉游戏好好学习,然而打了两个周也没升上去,看来是应该换个方向发挥了. 最近看了<javascript Promise迷离书>,对Promise的理解颇有加深.那么就从总结Promise开始吧. 1 什么是Promise? 抽象描述: promise是一个规范,提供了一套精心定义的.用来与代表一个可能会在任意时刻完成或失败的异步过程的结果的对象交互的接口."Promise把异步处理对象和处理规则进行规范化, 并按照采用统一的接口来编写,而采取规定方法

ES6新特性:Javascript中内置的延迟对象Promise

Promise的基本使用: 利用Promise是解决JS异步执行时候回调函数嵌套回调函数的问题, 更简洁地控制函数执行流程: 通过new实例化Promise,  构造函数需要两个参数, 第一个参数为函数执行成功以后执行的函数resolve, 第二个函数为函数执行失败以后执行的函数reject: new Promise(function(resolve , reject) { }); 通过Promise,我们把回调函数用线性的方式写出来,而不是一层套一层, 这个函数有四层回调: fn("args&

JavaScript ES6 promiss的理解。

本着互联网的分享精神,我将我对promise的理解分享给大家. JavaScript ES6的promise方法主要应用在处理异步函数返回的结果,注意他不是将异步函数转换为同步函数,而是等异步函数有结果时在调用相应的方法进行处理. promise有以下方法 then() - 它最多需要有两个参数,第一个是成功后调用的方法,第二个是失败后调用的方法. catch() - 失败后调用的方法,他与then方法的失败后调用的方法类似,但是使用上有些区别,等下我会用案例讲解. all() - 接收一个数组

对ES6的理解

ES6 ES6的了解es6是一个新的标准,它包含了许多新的语言特性和库,是JS最实质性的一次升级.比如'箭头函数'.'字符串模板'.'generators(生成器)'.'async/await'.'解构赋值'.'class'等等,还有就是引入module模块的概念. 箭头函数可以让this指向固定化,这种特性很有利于封装回调函数(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象.(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误.(3)不可以使用

谁的Promise?

Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Promise对象. 如果你以为这是一篇悲伤的爱情故事,不好意思,那你是"被标题"了. 前段时间在用Nodejs开发一个可视化流程工具的过程中,涉及到文件批处理的功能,比如批处理N个样式文件. 我们知道Nodejs读取文件分为阻塞式和非阻塞式2种 阻塞式处理流程如下 假设每个文件的处理时间分别为 T[0,1,2-n],所有

通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise

Deferred 和 Promise ES6 和 jQuery 都有 Deffered 和 Promise,但是略有不同.不过它们的作用可以简单的用两句话来描述 Deffered 触发 resolve 或 reject Promise 中申明 resolve 或 reject 后应该做什么(回调) 在 jQuery 中 var deferred = $.Deferred(); var promise = deferred.promise(); 在 ES6 中 var deferred = Pro

浅谈promise对象

背景: 最近项目在做小程序的开发,涉及设计一个统一的登录公共方法,当实现时涉及到多个异步请求,那么问题来了,如何让多个异步请求先后同步进行呢?很多人会想到使用多层嵌套套来实现,就像这样: function fun1() { fun2() { fun3() { fun4() { } } } } 可是嵌套难以维护而且耦合性很高.不方便. 苦寻百度,最后找到Promise,Promise就是这样一个专门解决多个异步请求问题的对象. Promise 介绍 Promise是异步编程的一种解决方案,由社区提

阿里2018前端测评题(Promise异步流程控制)

用Promise控制异步流程,三个异步任务,时间可能有先后,但是要按照想要的顺序输出. 我这里用四种方法解决,其实也就是考察你对Promise的理解,基础题了. //实现mergePromise函数,把传进去的数组顺序先后执行, //并且把返回的数据先后放到数组data中 const timeout = ms => new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, ms); }); const ajax