困惑于如何使用.then()使用promise链接查询

时间:2019-06-14 23:40:16

标签: javascript node.js ecmascript-6 promise

我似乎无法将请求与承诺链接在一起。最让我感到困惑的是.then(function(doSomething)部分。

我应该在函数中添加什么(doSomething)?它是做什么的?

有人可以在不使用Promise.all而是使用.then()的情况下为我链接这些查询吗?所以我可以从中学习

SELECT * FROM books where book_id = $1

SELECT * FROM username where username = $2

SELECT * FROM saved where saved_id = $3

3 个答案:

答案 0 :(得分:5)

function(doSomething)在前一个Promise成功完成时运行,并且doSomething是响应。您可以使用then链接诺言,例如:

query("SELECT * FROM books where book_id = $1")
  .then(() => query("SELECT * FROM username where username = $2"))
  .then(() => query("SELECT * FROM saved where saved_id = $3"));

这将依次执行三个SQL查询。

但是,由于您很可能希望保存响应,因此可以使用async/await进行简化:

async function threeQueries() {

  //Fetch all three queries in sequence
  let queryOne = await query("SELECT * FROM books where book_id = $1");
  let queryTwo = await query("SELECT * FROM username where username = $2");
  let queryThree = await query("SELECT * FROM saved where saved_id = $3");

  //Extract the response text from our queries
  let resultOne = await queryOne.text();
  let resultTwo = await queryTwo.text();
  let resultThree = await queryThree.text();

  //Return the responses from the function
  return [resultOne, resultTwo, resultThree];

}

您也可以像这样使用Promise.all

Promise.all([
  query("SELECT * FROM books where book_id = $1"), 
  query("SELECT * FROM username where username = $2"), 
  query("SELECT * FROM saved where saved_id = $3")
]);

答案 1 :(得分:3)

Promises的目的是实现更好的异步操作流控制。如果您必须以多种顺序完成多个任务,然后才能继续执行代码流,请使用Promise.all。使用Promise。然后在您有多个异步任务,其中每个步骤可能部分取决于上一个任务的结果时(例如,查询books表后,您可以使用books.savedByUserId查询用户名表以获取适当的用户记录)。

请参考以下示例:maxDequeueCount setting in your host.json file.作者提供了一个简单的mySql包装器,该包装器返回Promises(database.query返回新的Promise)。

line=line.split()
if 'bit' in line[0] or 'yit' in line[0] or 'If' in line[-2] or 'yup' in line[-2] : 

p.s。并不是为了解决问题,但在这种情况下,三个连续的sql查询很可能会替换为带有连接的单个查询,但是我想这并不是问题的重点。我们假设这是三个查询来分开存储,这是有道理的。

答案 2 :(得分:1)

我们使用promise,它们是将来可能会产生单个值的对象。

运行query("query string")时,它将异步返回Promise对象。这意味着,您的应用不会等待查询完成。它将开始查询过程,然后继续进行下一行代码。

那么,查询完成后如何处理?

我们使用then处理查询返回的信息。查询成功完成后,then将被触发。