我在理解ES6 Promises和Async / await时遇到困难。
[我在youtube上查找了解释这些主题的视频,但我的头仍然沉没不起来,它们之间有什么区别,我何时应该在Promise on Async / await或Async / await over Promises上使用?
还有我什么时候知道我的代码是“有效的” promise还是async / await。
[这里有两个示例(都在工作),它们从本地JSON服务器获取“公司”,完成后,它们遍历这些公司。
第一个示例:(使用承诺)
function getCompanies() {
return new Promise((resolve, reject) => {
fetch(`http://localhost:3000/companies`)
.then(response => response.json())
.then(response => resolve(response))
.catch(error => reject(error))
})
}
function loopCompanies(companies) {
companies.forEach((company) => {
console.log(company);
})
}
getCompanies().then(response => loopCompanies(response)).catch(error => console.log(error));
第二个示例:(使用异步/等待)
async function getCompanies() {
let response = await fetch(`http://localhost:3000/companies`);
let processedResponse = await response.json();
return processedResponse
}
function loopCompanies(companies) {
companies.forEach((company) => {
console.log(company);
})
}
async function doIt() {
try{
let response = await getCompanies();
loopCompanies(response)
} catch(error) {
console.log(error)
}
}
doIt()
所以我不知道这是否是我应该在示例1中使用Promises的方式?
这是我应该如何在示例2中使用Async / await吗?
它们之间有什么区别
第一个示例不必要地将手动创建的承诺包装在您已有的承诺周围。出于多种原因,这是一种反模式。您应该只返回fetch()
已经返回的承诺。您可以这样做:
function getCompanies() {
return fetch(`http://localhost:3000/companies`)
.then(response => response.json());
})
}
function loopCompanies(companies) {
companies.forEach((company) => {
console.log(company);
})
}
getCompanies().then(response => loopCompanies(response)).catch(error => console.log(error));
第二个示例(使用async/await
)对我来说很好。您可以通过更改以下内容来简化它:
async function getCompanies() {
let response = await fetch(`http://localhost:3000/companies`);
let processedResponse = await response.json();
return processedResponse
}
对此:
async function getCompanies() {
let response = await fetch(`http://localhost:3000/companies`);
return response.json();
}
由于不需要await
值,您将转到return
。相反,您可以直接返回承诺。两种方法都可以产生相同的结果,但是第二种方法只需较少的代码即可。
[我在youtube上查找了解释这些主题的视频,但我的头仍然沉没不起来,它们之间有什么区别,我何时应该在Promise on Async / await或Async / await over Promises上使用?
async
和await
绝对使用承诺。实际上,除非您await
一个承诺,否则await
不会有任何用处。并且,async
函数始终返回承诺。因此,async/await
不能替代承诺。它们是.then()
的替代方法,可为您提供不同的语法,有时使它们的编写,调试和读取更加友好,特别是当您要对多个异步操作进行排序时。
还有我什么时候知道我的代码是“有效的” promise还是async / await。
您的代码在成功和错误情况下都能提供正确的结果,并且编写时没有不必要的步骤且没有反模式,因此有效。除此之外,没有神奇的答案。我所知道的没有工具可以告诉您这一点。就像没有工具会告诉您100行功能是否编写正确。您必须学习Javascript异步开发的良好编码实践,然后才能认识到良好的模式和不太好的模式。
所以我不知道这是否是我应该在示例1中使用Promises的方式?
请参阅上面的固定示例,从示例1中删除反模式。
这是我应该如何在示例2中使用Async / await吗?
是的,这很好,但是可以如我在上面的示例中所示的那样进一步简化。
它们之间有什么区别
在我的两个修订示例中,它们实现了相同的结果。它们只是两种不同的编码样式。您可以决定自己喜欢哪一种。 “哪一个比另一个更正确”。
我的个人风格是在有充分理由使用时使用async/await
,例如:
async/await
的较旧JS引擎中运行时。