Javascript - 等待不在返回承诺的异步函数中等待

问题描述 投票:0回答:1

我最近开始学习 javascript,但在理解该语言的异步行为方面遇到了很大的问题。我花了数百个小时进行搜索,每个人都建议使用 Promise,但我不太明白我做错了什么(也许全部都错了,哈哈)。

我尝试了每个论坛中几乎每个人都推荐的 Promise,并想出了这段代码,但不知何故,我无法让它等待 function1 在 function2 中完成,因为我知道 Promise1 是未定义的。

 async function function1() {
    let query = "SELECT * FROM table1";

    connection.query(query, (error, result) => {
        if (error) throw error;
        console.log("Length " result.rows.length);

        let result_query = [];
        let i = 0;
        while (i < result.rows.length) {
            result_query.push(result.rows[i]);
            i++;
        }

    let customPromise = new Promise((resolve, reject) => {
        if(result_query.length > 0){
            resolve(result_query);
        } else {
            reject(new Error('ERROR'))
        }
        });
    customPromise.then(() => {
        return customPromise;
    });
};

async function function2() {
    promise1 =  await function1();
    promise1.then(function(){ //HERE I GET THAT PROMISE1 IS UNDEFINED
        console.log("Exit");
    })
}

这是我的原始代码,我意识到 javascript 具有异步性质,并且它在 function1 完成之前在 function2 中打印“Exit”。如果这是一个显而易见的问题,我很抱歉,但我感到很困惑。谢谢大家帮助陌生人的善意。

async function function1() {
    let query = "SELECT * FROM table1";

    connection.query(query, (error, result) => {
        if (error) throw error;
        console.log("Length " result.rows.length); //*THIS PRINTS AFTER THE EXIT IN FUNCTION2

        let result_query = [];
        let i = 0;
        while (i < result.rows.length) {
            result_query.push(result.rows[i]);
            i++;
    }

    if(result_query.length > 0){
        return(result_query);
    } else {
        return("ERROR");
    }
};

async function function2() {
    function1();
    console.log("Exit"); //*THIS PRINTS BEFORE EVERYTHING
}

OUTPUT:
> Exit
> Length 2
javascript async-await
1个回答
0
投票
connection.query(query, (error, result) => {
  if (error) throw error;
  console.log("Length ", result.rows.length);

  let result_query = [];
  let i = 0;
  while (i < result.rows.length) {
    result_query.push(result.rows[i]);
    i++;
  }
});

这段代码正在为其异步代码使用回调。如果你想将其转换为 Promise,你可以这样做:

const promise = new Promise((resolve, reject) => {
  connection.query(query, (error, result) => {
    if (error) reject(error);
    else resolve(result);
  });
})
const result = await promise;

然后你可以用 while 循环来构建

result_query
,但这实际上并不需要。 result.rows 已经包含您需要的内容,并且不需要将其复制到另一个数组。所以完整的功能是:

async function function1() {
  let query = "SELECT * FROM table1";

  const promise = new Promise((resolve, reject) => {
    connection.query(query, (error, result) => {
      if (error) reject(error);
      else resolve(result);
    });
  });

  const result = await promise;
  if (result.rows.length > 0) {
    return result.rows;
  } else {
    return "ERROR";
  }
}

然后要使用它,你可以这样做:

async function function2() {
  const rows = await function1();
  console.log("Exit");
}
© www.soinside.com 2019 - 2024. All rights reserved.