向我解释,就像我5岁-ES6 Promises和async / await的区别,我的代码“正确”吗?

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

我在理解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吗?

它们之间有什么区别

javascript asynchronous promise async-await
1个回答
0
投票

第一个示例不必要地将手动创建的承诺包装在您已有的承诺周围。出于多种原因,这是一种反模式。您应该只返回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上使用?

asyncawait绝对使用承诺。实际上,除非您await一个承诺,否则await不会有任何用处。并且,async函数始终返回承诺。因此,async/await不能替代承诺。它们是.then()的替代方法,可为您提供不同的语法,有时使它们的编写,调试和读取更加友好,特别是当您要对多个异步操作进行排序时。

还有我什么时候知道我的代码是“有效的” promise还是async / await。

您的代码在成功和错误情况下都能提供正确的结果,并且编写时没有不必要的步骤且没有反模式,因此有效。除此之外,没有神奇的答案。我所知道的没有工具可以告诉您这一点。就像没有工具会告诉您100行功能是否编写正确。您必须学习Javascript异步开发的良好编码实践,然后才能认识到良好的模式和不太好的模式。

所以我不知道这是否是我应该在示例1中使用Promises的方式?

请参阅上面的固定示例,从示例1中删除反模式。

这是我应该如何在示例2中使用Async / await吗?

是的,这很好,但是可以如我在上面的示例中所示的那样进一步简化。

它们之间有什么区别

在我的两个修订示例中,它们实现了相同的结果。它们只是两种不同的编码样式。您可以决定自己喜欢哪一种。 “哪一个比另一个更正确”。

我的个人风格是在有充分理由使用时使用async/await,例如:

  1. 我正在排序的多个异步操作。
  2. 导致更简单,更简单的错误处理。
  3. 导致更简单的代码。
  4. [当我想确保同步异常被捕获并变成被拒绝的承诺时。
  5. 当我不需要在不进行编译就可能不支持async/await的较旧JS引擎中运行时。
© www.soinside.com 2019 - 2024. All rights reserved.