LoginSignup
3
5

More than 5 years have passed since last update.

Promiseで複数の非同期処理を書く(Node v4以降、ライブラリなし)

Posted at

目的

例えばファイル読み込み、SQL発行、HTTPリクエスト、とか順序だててやらないといけない時、複数の非同期処理をネストしたコールバックから置き換える

環境

node v4~(v4.3.2 or v5.0.0で確認)

コールバック(書き換え前)

callback.js
var fs = require('fs');

console.log('readFile ---- start.');
fs.readFile('a.txt', function(err, data){
    console.log('readFile ---- a.txt data : '+data);
    fs.readFile('b.txt', function(err, data){
        console.log('readFile ---- b.txt data : '+data);
        fs.readFile('c.txt', function(err, data){
            console.log('readFile ---- c.txt data : '+data);
        });
    });
});
$ node callback.js
readFile ---- start.
readFile ---- a.txt data : a.txtの内容
readFile ---- b.txt data : b.txtの内容
readFile ---- c.txt data : c.txtの内容

Promise(書き換え後)

promise.js
'use strict'

const fs = require('fs');

new Promise((resolve, reject)=>{
    console.log('Promise ---- start.');
    fs.readFile('a.txt', (err, data)=>{
        !err ? resolve(data) : reject(err);
    });
}).then((result)=>{
    console.log('Promise ---- a.txt result : '+result);
    return new Promise((resolve, reject)=>{
        fs.readFile('b.txt', (err, data)=>{
            !err ? resolve(data) : reject(err);
        });
    })
}).then((result)=>{
    console.log('Promise ---- b.txt result : '+result);
    return new Promise((resolve, reject)=>{
        fs.readFile('c.txt', (err, data)=>{
            !err ? resolve(data) : reject(err);
        });
    })
}).then((result)=>{
    console.log('Promise ---- c.txt result : '+result);
},(err, hoge)=>{
    console.log('Promise ---- err : '+err+' hoge:'+hoge);
});

$ node promise.js
Promise ---- start.
Promise ---- a.txt result : a.txtの内容
Promise ---- b.txt result : b.txtの内容
Promise ---- c.txt result : c.txtの内容

層が深くなればなるほどPromiseのが見やすくなる
ライブラリに依存したくない場合はこんな感じで書くつもり

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5