Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS Promise包装函数返回;无法读取属性';0';“未定义”的定义;_Javascript_Promise - Fatal编程技术网

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

Javascript JS Promise包装函数返回;无法读取属性';0';“未定义”的定义;,javascript,promise,Javascript,Promise,我的所有更改都在此功能中: fetchRows(sqlQuery) { let aPromise = new Promise((resolve, reject) => { setTimeout(function () { if (sqlQuery) { resolve(I.getResults(sqlQuery)); } reject("Not a valid query"); }, 38)

我的所有更改都在此功能中:

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 promise noob)如果我删除了所有内容,并将“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(…)
,这样您就跳出了函数范围,而不会触发拒绝,这反过来又会导致您返回未定义。

您的问题是
resolve()
不会中断流程,因此您也可以调用
reject


要解决此问题,请使用
返回解析(…)
以便跳出函数范围,而不会触发拒绝,这反过来又会导致返回未定义的函数。

您可以尝试将新的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);
 });
};

您可以尝试将新的Promise函数重构为异步函数,而不是setTimeout,这会导致您使用未定义的数据进行解析,因为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);
 });
};


什么是
I.getResults()
?我们能看到那个代码吗?如果您使用的是
Promise
为什么要使用
setTimeout
?这里发生的事情是,您返回的是
setTimeout
,而不是承诺。检查这个问题的答案在@dee中编辑它我也会检查这个问题谢谢!作为参考,Promise构造反模式:什么是
I.getResults()
?我们能看到那个代码吗?如果您使用的是
Promise
为什么要使用
setTimeout
?这里发生的事情是,您返回的是
setTimeout
,而不是承诺。检查这个问题的答案在@dee中编辑它我也会检查这个问题谢谢!作为参考,Promise Construction Antipattern:听起来不错,让我来实现这个,天哪,我当然认为我最初也有一个else,我可能会丢失。我不这么认为,因为即使调用了reject方法,它也会触发.catch,这永远不会导致未定义的问题。属性zero表示代码共享之外的某些东西希望返回数组;我的猜测是,由于捕获到拒绝而不返回结果意味着返回未定义和未定义的[0]将导致错误消息。听起来不错,让我来实现这一点,天哪,我当然认为我最初也有一个else,我可能会丢失。我不这么认为,因为即使调用了reject方法,它也会触发.catch,这永远不会导致未定义的问题。属性zero表示代码共享之外的某些东西希望返回数组;我的猜测是,由于捕获到拒绝而不返回结果意味着返回未定义和未定义的[0]将导致错误消息。我不认为这有什么区别。在任何情况下,如果
I.getResults
返回承诺,为什么要用另一个承诺来包装呢?您可以尝试下面的代码来查看getResults函数的问题,即使它返回的承诺您不知道它什么时候会解决,所以您必须等待调用getResults,然后再使用结果来解决fetchRows承诺,以获得更多解释实现getResults,如下所示尝试在fetchRows中解析它,它将导致未定义的结果:const getResults=()=>{setTimeout(()=>newpromise(resolve=>resolve('aaaaaa')),10;};这听起来不对@Mohamed。在
getResults
的示例实现中,您没有返回,因此默认情况下会返回
undefined
。即使您打算使用arrow函数的隐式返回特性,您的承诺也会被一个
setTimeout
调用包装起来,因此您将返回该调用的结果,而不是承诺。这是一个非常有名的反模式:我看不出这有什么区别。在任何情况下,如果
I.getResults
返回承诺,为什么要用另一个承诺来包装呢?您可以尝试下面的代码来查看getResults函数的问题,即使它返回的承诺您不知道它什么时候会解决,所以您必须等待调用getResults,然后再使用结果来解决fetchRows承诺,以获得更多解释实现getResults,如下所示尝试在fetchRows中解析它,它将导致未定义的结果:const getResults=()=>{setTimeout(()=>newpromise(resolve=>resolve('aaaaaa')),10;};这听起来不对@Mohamed。在
getResults
的示例实现中,您没有返回,因此默认情况下会返回
undefined
。即使您打算使用arrow函数的隐式返回功能,您的承诺也会被一个
setTimeout
调用包装,因此您将返回该调用的结果,而不是承诺。这是一个非常有名的反模式: