如何创建一个异步函数超时错误处理程序作为驻留在服务文件中的羽毛中的钩子,以处理钩子中的promise?
根据@Bergi的建议专门创建的帖子
如果您希望实现通用的异步功能超时(对于承诺由于任何原因而无法实现)作为featherjs钩子,您可能想问一个关于(专门!)的新问题那。
由错误处理程序处理以防止挂起的示例钩子,如下所示:
const errors = require('@feathersjs/errors');
module.exports = function (options = {}) {
return async context => {
let promise = new Promise((resolve,reject) => {
context.app.service('database').find({
query: {"id":context.data.id}
}).then(result => {
resolve(result.data[0].data)
// console: error: Unhandled Rejection at: Promise
//browser: hangs
});
});
let result = await promise;
if (result) {
return context;
}
};
};
如果featherjs find返回一个承诺,那么就不需要将其包装为一个。
但是我想我理解的问题是,featherjs在无法拒绝或解决丢失的ID的意义上被破坏。如果我理解正确,则可以使用Promise.race()
实现自己的超时// find with the given id, or reject after quitAfter milliseconds
async function findById(id, quitAfter) {
let timer = new Promise(function(resolve, reject) {
setTimeout(reject, quitAfter, 'timeout exceeded');
});
let query = context.app.service('database').find({
query: { "id": id }
});
return Promise.race([timer, query]);
}