JS Promise包装器函数返回“无法读取未定义的属性'0'”

时间:2018-10-23 20:45:18

标签: javascript promise

我所做的一切都在此功能中:

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);
      });
    });
  }

2 个答案:

答案 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);
 });
};