Promise.promisify可以将原有的函数封装成promise的调用方式。 下面的是传统的异步调用方式。javascript
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转换函数后的调用方式java
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。c++
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); })
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.join(promise
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({ 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")的文件内容ui
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请求,输出其中最快的二次请求的信息。code
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); })
这个方法能够遍历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
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三个文件的内容,而且将内容转换成整形,最终输出累加后的数据。