2016-08-01 54 views
4

私はnode.jsとpg-promiseの新機能です。同期プログラミングのバックグラウンドから来ています。新しい考え方が必要です。pg-promiseを使った同期プログラミング

メインプログラムロジックの前にデータベースの初期化を実行するシナリオから始めます。この例に

db.query("DELETE FROM records") 
    .then(function (data) { 
    // success; 
    console.log("This is where all my main logic goes"); 
    }) 
    .catch(function (error) { 
    // error; 
    }); 

それともとして読んでしまう::私の理解では、とのことです

db.query("DELETE FROM records") 
    .then(function (data) { 
    // success; 
    }) 
    .catch(function (error) { 
    // error; 
    }); 
console.log("This is where all my main logic goes"); 

https://github.com/vitaly-t/pg-promise/wiki/Learn-by-Example#simple-select

db.any("select * from users where active=$1", [true]) 
    .then(function (data) { 
    // success; 
    }) 
    .catch(function (error) { 
    // error; 
    }); 

私のコードは、どちらかと読んでいました後者はレコードが削除される前に表示されるed。

更新: 約束とコールバックに多数の記事を読んだ後、私はPG-約束があること.thenと成功とエラーのシナリオの両方のための.catch連鎖を使用していることを理解しています。

:その後、私のコード内から、私は非同期機能を実行します簡単なコマンドで関数を呼び出します

function initialiseDB() { 
    db.query("DELETE FROM records") 
    .then(function (data) { 
     // success; 
    }) 
    .catch(function (error) { 
     // error; 
    }); 
    } 

:私も、今、私はPG-約束コマンドのような機能ラッパー内に配置する必要があります理解して信じています

initialiseDB(); 

しかし、この非同期コーディングと約束がプログラムの全体構造にどのように適合するかはまだ分かりませんが、プログラムのほぼすべてが初期化を最初に完了する必要があります。したがって、プログラム全体を関数の ".then"セクションに配置する必要はありませんか?すなわち、トップレベルの唯一のコードは事実上intialiseDB()関数であろうか?

// Start of code here 
var pgp = require('pg-promise')(); 

//Configure the database connection 
var config = { 
    user:    'username', //env var: PGUSER 
    database:   'database', //env var: PGDATABASE 
    password:   'password', //env var: PGPASSWORD 
}; 

var db = pgp(config); 

function initialiseDB() { 
    db.query("DELETE FROM records") 
    .then(function (data) { 
     // This is where the main program logic goes after this line; 
    }) 
    .catch(function (error) { 
     // error; 
    }); 
} 

// Commence the program here 
initialiseDB(); 
+0

これは最初のものです。また、約束を正しく使用することについて読むべきであり、今日[PromiseJS](https://www.promisejs.org/)から始めて、それに関する多くの情報があります。 –

+0

ありがとう、すべて私に新しい。 「初期のノードでは、「約束」という機能を試して、非同期コードをより線形的に見せるためにいくつかの機能を追加しました。それはいくつかの理由からノードのコアから抜け出しました。 "https://github.com/maxogden/art -of-node/blob/master/readme.md – Dercni

+0

これは悪い記事で、そのようなナンセンスを示唆することさえできます。今日、非同期コードを書くための最善の方法は約束です。 –

答えて

0

はPGは約束し、実際にnodejs新しいバージョンのgeneratorsasync/awaitの使用が可能になります。 Generatorsは、システムに組み込まれVITALY約束を有するアダプタを必要とするので、generator functionを供給するgeneratorsなし同期方法

Taken from the repository under the tag task

クリーナーコードフローを可能にする:generators

db.task(t => { 
     // this.ctx = task config + state context; 
     return t.one('SELECT * FROM users WHERE id = $1', 123) 
      .then(user => { 
       return t.any('SELECT * FROM events WHERE login = $1',user.name); 
      }); 
    }) 
    .then(events => { 
     // success; 
    }) 
    .catch(error => { 
     // error; 
    }); 

db.task(function * (t) { 
     // this.ctx = task config + state context; 
     let user = yield t.one('SELECT * FROM users WHERE id = $1', 123); 
     return yield t.any('SELECT * FROM events WHERE login = $1', user.name); 
    }) 
    .then(events => { 
     // success; 
    }) 
    .catch(error => { 
     // error 
    }); 

を使用している場合の場合、をasync function (t)yieldに置き換えて簡単に交換することができます。awaitと同じように動作します。

いくつかの注意点:彼らはgeneratorsasync/await

db.task(function * (t) { 
    yield Promise.reject(new Error('This will cause your app to error') 
} 

You should also pay close attention to his pg-promise demo!それ'LLバブルエラーをよよう

より複雑なロジックで、あなたは、失敗する可能性があります物事の周りのtry catchブロックを使用する必要があります拡張イベント、repos、外部SQLファイル、ヘルパーのようなライブラリの他の多くの素晴らしいことのような素晴らしいことを教えてくれます!

関連する問題