文档章节

bluebird 笔记

罗布V
 罗布V
发布于 2017/07/21 10:25
字数 740
阅读 24
收藏 0

bluebird 笔记

将传统方法封闭成promise方式

Promise.promisify能够将原有的函数封装成promise的调用方式。 下面的是传统的异步调用方式。

import {readFile} from 'fs'
readFile('file1.txt',function(err,data){
    if(err){
        console.log('read file error');
    }else{
        console.log(`read file data:${data.toString()}`);
    }
})

利用Promise.promisify转换函数后的调用方式

let Promise = require("bluebird")
var readFile = Promise.promisify(require("fs").readFile);
readFile("file1.txt","utf8").then(function(contents){
    console.log(`read file data:${contents}`);
}).catch(function(e){
    console.log('error read file',e);
})

除了用Promise.prosisify之后bluebird还提供了一种能够转换整个调用对象的方法 Promise.promisifyAll。

let Promise = require("bluebird")
var fs = Promise.promisifyAll(require("fs"));
fs.readFile("file1.txt","utf8").then(function(contents){
    console.log(`read file data:${contents}`);
}).catch(function(e){
    console.log('error read file',e);
})

处理多个promise返回值

var Promise = require('bluebird');
var fs=Promise.promisifyAll(require("fs"))
Promise.all([
    fs.readFileAsync("file1.txt"),
    fs.readFileAsync("file2.txt")
]).spread(function(file1text, file2text) {
    if (file1text === file2text) {
        console.log("files are equal");
    }
    else {
        console.log("files are not equal");
    }
});

上面的代码的代码是异步读取file1.txt和file2.txt文件,并且将文件的内容存入到file1text和file2text中,一旦两个文件的内容相同输出files are equal,不相同输出files are not equal。

多个promise 处理

Promise.join(

Promise<any>|any values...,
function handler

) -> Promise

var Promise = require("bluebird");
var join = Promise.join;

join(getPictures(), getComments(), getTweets(),
    function(pictures, comments, tweets) {
    console.log("in total: " + pictures.length + comments.length + tweets.length);
});

上面的的代码调用 getPictures(), getComments(), getTweets()三个异步的操作,同时输出操作的结果 下面的代码完成赞同于上面的代码,只不过将Promise.join换成了Promise.all,并且传一个数组

var Promise = require("bluebird");
var join = Promise.join;

Promise.all([getPictures(), getComments(), getTweets()],
    function(pictures, comments, tweets) {
    console.log("in total: " + pictures.length + comments.length + tweets.length);
});

Promise.props

Promise.props({
    file1: fs.readFileAsync("file1.txt"),
    file2: fs.readFileAsync("file2.txt")
}).then(function(result) {
    console.log(result.file1,result.file2);
});

props能将将返回的结果放置在一个Object对象当中,可以通过result.file1来访问fs.readFileAsync("file1.txt")的文件内容

Promise.some

Promise.some([
    ping("ns1.example.com"),
    ping("ns2.example.com"),
    ping("ns3.example.com"),
    ping("ns4.example.com")
], 2).spread(function(first, second) {
    console.log(first, second);
});

上面通过Promise.some方法来调用四次ping请求,输出其中最快的二次请求的信息。

Promise.finally

finally方法有点类似于c++中的try catch..finaly,不过promise过程是否成功,都将调用finally的方法,可以在这个方法里面写一些资源的释放之类的语句。

var Promise=require('bluebird')
function _setTimeout(time){
  return new Promise((resolve, reject) => {
    setTimeout(resolve('resolve'),time);
  }).finally(()=>{
    console.log('success');
  })
}
_setTimeout(2000).then((content)=>{
  console.log(content);
})

Promises.map

这个方法可以遍历Object,再通过遍历的值来直接调用 Promise方法

var Promise=require('bluebird')
var fs=Promise.promisifyAll(require("fs"))
var promise=[]
var filesNames=[]
for(var i=1;i<=2;i++){
  promise.push(fs.readFileAsync(`file${i}.txt`))
  filesNames.push(`file${i}.txt`)
}
//使用传统的Promise.all方法
Promise.all(promise).then(function(){
  console.log('all');
})
//通过map来批量调用
Promise.map(filesNames, (fileName) => {
  return fs.readFileAsync(fileName)
}).then(() => {
  console.log('done');
})

Promise.reduct

这个方法可以顺序的执行promise

Promise.reduce(["file1.txt", "file2.txt", "file3.txt"], function(total, fileName) {
    return fs.readFileAsync(fileName, "utf8").then(function(contents) {
        return total + parseInt(contents, 10);
    });
}, 0).then(function(total) {
  console.log(total);
});

上面的代码段是,顺序的读取file1,file2,file3三个文件的内容,并且将内容转换成整形,最终输出累加后的数据。

© 著作权归作者所有

罗布V
粉丝 13
博文 60
码字总数 47114
作品 0
温州
程序员
私信 提问
Promise实现之bluebird 5分钟入门教程

常用资料(记得收藏) bluebird快速参考 nodejs的所有调用几乎是全异步的,而所有的IO操作也都是通过回调函数才能知道结果。如果一个异步调用依赖另一个异步调用,如果没有Promise的话,代码会...

go-skyblue
2015/11/24
5.8K
0
初识JavaScript Promises之二

初始JavaScript Promises之二 上一篇我们初步学习了JavaScript Promises,本篇将介绍Promise如何优雅地进行错误处理以及提升操作node.js风格1的异步方法的逼格,没错就是使用promisify2。 异...

梵高
2014/07/15
231
0
输入hexo g,出现了问题

$ hexo g Native thread-sleep not available. This will result in much slower performance, but it will still work. You should re-install spawn-sync or upgrade to the lastest versi......

VicITman
2016/03/03
2.4K
3
使用 Bluebird 开发异步的 JavaScript 程序

JavaScript 异步编程 JavaScript 是一门单线程语言,被广泛的应用于浏览器端和页面 DOM 元素交互。自从 Node.js 横空出世,JavaScript 的领域由浏览器扩展到服务器端,变成了一种通用的计算机...

虞 里杉
2018/03/14
0
0
Node.js最新Web技术栈(2016年4月)

Node.js最新Web技术栈(2016年4月) 上一次的发布的是精华 Node.js最新Web技术栈(2015年5月),感谢大家喜爱,值此koa2.0发布后,决定再次升级技术栈 Node.js是比较简单的,只有你有前端js基...

i5ting
2016/04/01
6K
10

没有更多内容

加载失败,请刷新页面

加载更多

PhotoShop 色调:理解直方图/RGB通道信息

一、直方图:图表的形式,展示图像像素分布的情况 1.平均值:表示平均亮度 2.标准偏差值:表示亮度值范围内的中间值 3.像素: 表示用于计算直方图的像素总数 4.色阶:显示指针下面的区域亮度...

东方墨天
21分钟前
5
0
wildfly(JBoss AS)应用服务器快速入门

什么是wildfly JBoss AS 从8版本起名为wildfly。Wildfly是一个开源的基于JavaEE的轻量级应用服务器。可以在任何商业应用中免费使用。 WildFly是一个灵活的、轻量的、强大管理能力的应用程序服...

程序新视界
46分钟前
4
0
Java集合类常见面试知识点总结

Java集合类学习总结 这篇总结是基于之前博客内容的一个整理和回顾。 这里先简单地总结一下,更多详细内容请参考我的专栏:深入浅出Java核心技术 https://blog.csdn.net/column/details/21930...

Java技术江湖
49分钟前
6
0
怎么用for循环打出爱心

先上效果图: 这是用*组成的爱心,下面讲讲思路: 首先这个图形可以拆分成三部分:第一部分是上面三行的两个梯形,第二部分是中间三行的长方形,第三部分是最下面的倒三角形。 其实图形拆分好...

INEVITABLE
55分钟前
4
0
用HttpUrlConnection伪造成HttpClient

https://www.jianshu.com/p/27ad06cc39d2

shzwork
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部