簡體   English   中英

JS Promise包裝器函數返回“無法讀取未定義的屬性'0'”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM