От автора на pg-promise...
pg-promise не поддържа анулиране на заявка, защото е хак за заобикаляне на неправилен дизайн на база данни или лошо изпълнение на заявка.
PostgreSQL поддържа събития, които трябва да се използват при изпълнение на отнемащи време заявки, така че вместо да чака, човек може да настрои слушател на събитие да се задейства, когато конкретни данни/изглед станат достъпни. Вижте примера LISTEN/NOTIFY.
Можете да разширите pg-promise със свой собствен персонализиран метод на заявка, който ще изтече с отхвърляне (вижте примера по-долу), но това отново е още едно заобикаляне на проблема в допълнение към проблем с дизайна.
Пример за използване на Bluebird:
const Promise = require('bluebird');
Promise.config({
cancellation: true
});
const initOptions = {
promiseLib: Promise,
extend(obj) {
obj.queryTimeout = (query, values, delay) => {
return obj.any(query, values).timeout(delay);
}
}
};
const pgp = require('pg-promise')(initOptions);
const db = pgp(/* connection details */);
След това можете да използвате db.queryTimeout(query, values, delay)
на всяко ниво.
Като алтернатива, ако използвате Bluebird, можете да верига .timeout(delay)
към някой от съществуващите методи:
db.any(query, values)
.timeout(500)
.then(data => {})
.catch(error => {})
Вижте също:
- разширете събитие
- Bluebird.timeout
АКТУАЛИЗИРАНЕ
От версия 8.5.3 pg-promise започна да поддържа изчакване на заявка чрез свойство query_timeout
в обекта за връзка.
Можете да отмените настройките по подразбиране:
pgp.pg.defaults.query_timeout = 3000; // timeout every query after 3 seconds
Или го посочете в обекта за връзка:
const db = pgp({
/* all connection details */
query_timeout: 3000
});