[英]JS Promise wrapper function returns “Cannot read property '0' of undefined”
我所做的一切都在此功能中:
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);
});
});
}
您的問題是resolve ()
不會中斷流程,因此您還調用了reject
。
要解決此問題,請使用return resolve (...)
以使您跳出函數范圍並且不觸發拒絕,從而導致您返回未定義的結果。
您可以嘗試將新的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);
});
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.