我似乎无法将请求与承诺链接在一起。最让我感到困惑的是.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
答案 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
将被触发。