我所做的一切都在此功能中:
fetchRows(sqlQuery) {
let aPromise = new Promise((resolve, reject) => {
setTimeout(function () {
if (sqlQuery) {
resolve(I.getResults(sqlQuery));
}
reject("Not a valid query");
}, 38);
});
return aPromise.then((sqlQuery) => {
console.log('Success:', sqlQuery);
}).catch((errorMessage) => {
console.log(errorMessage);
});
},
未定义什么属性?承诺结构中缺少什么吗? (我是一个JS承诺新手)如果我删除所有内容并只包装“ I.getResults(sqlQuery)”,它将运行良好,我认为关于承诺的某些事情会丢掉它。
这是getResults函数
/**
* Get query resultset
* @param {*} sqlQuery
*/
getResults(sqlQuery) {
return connection.then(client => {
return client.query({
rowMode: 'array',
text: sqlQuery,
}).then(res => {
return res.rows;
}).catch(e => {
client.release();
pool.end();
console.error('query error', e.message, e.stack);
});
});
}
答案 0 :(得分:1)
您的问题是resolve ()
不会中断流程,因此您也致电reject
。
要解决此问题,请使用return resolve (...)
,以使您跳出函数范围并且不触发拒绝,从而导致您返回未定义的内容。
答案 1 :(得分:1)
您可以尝试将新的Promise函数重构为异步函数,而不是setTime out,这会导致您使用未定义的数据进行解析,因为 getResults 也是异步函数,因此您可以等待调用的 getResults 并根据您的结果进行解析,因此您可以进行以下修改:
const fetchRows = (sqlQuery) => {
const aPromise = new Promise(async (resolve, reject) => {
if (sqlQuery) {
const sqlQueryResult = await I.getResults(sqlQuery);
return resolve(sqlQueryResult);
}
return reject('Not a valid query');
});
return aPromise.then((sqlQuery) => {
console.log('Success:', sqlQuery);
}).catch((errorMessage) => {
console.log(errorMessage);
});
};