bluebird 筆記

bluebird 筆記

將傳統方法封閉成promise方式

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);
})

處理多個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

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")的文件內容ui

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請求,輸出其中最快的二次請求的信息。code

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三個文件的內容,而且將內容轉換成整形,最終輸出累加後的數據。

相關文章
相關標籤/搜索