2016-08-01 3 views
4

Я новичок в node.js и pg-обещании, исходящих из фона программирования синхронизации, для чего требуется новое мышление.Синхронное программирование с использованием pg-prom

Я хотел бы начать с сценария запуска инициализации базы данных до основной логики программы.

Следуя этому примеру: 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; 
    }); 

ли мой код читаться либо:

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

Я понимаю, что с последнее сообщение будет отображаться до удаления записей редактор

Update: После прочтения многочисленных статей по обещаниям и обратных вызовов Я понимаю, что пг-обещание использует цепочки будучи .then и .catch как для успеха и ошибок сценариев. Я и сейчас считаю, что я понимаю, что команда пг-обещание следует поместить в функции оболочки, такие как:

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

Тогда внутри моего кода я бы вызвать функцию с помощью простой команды, которая будет запускать функцию асинхронно:

initialiseDB(); 

однако я до сих пор не уверен в том, как это понятие asychronous кодирования и обещаний вписывается в общую структуру программы, конечно, почти все в программе нужна будет инициализация быть завершены первым. Соответственно, вся программа не должна быть помещена в раздел «.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 обещают фактически позволяет использование generators и async/await на более новых версиях nodejs. Generators требуется адаптер с обещаниями, что Vitaly, встроенными в систему, поэтому подача generator function позволит более чистый поток кода в синхронном режиме

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

С generators:

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/await, вы можете просто заменить function * (t) на async function (t) и yield с await, и он будет работать так же.

Некоторые предостережений:

В более сложной логики, вы должны использовать пытаться ловить блоки вокруг вещей, которые могут потерпеть неудачу, поскольку они будут Пузырь ошибка в generators и async/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! Это будет научите вас отличным вещам, таким как экстренное событие, репозитории, внешние файлы SQL и множество других замечательных вещей в библиотеке, таких как помощники!

Смежные вопросы