使用提取功能,为什么我需要这么多的“ await”语句?

时间:2018-11-06 02:00:51

标签: async-await es6-promise fetch-api

我在一个函数中有一条提取指令,该指令从服务器获取API密钥,其他一些对象使用该指令将API密钥传递给任何需要它的服务。

export default async function getAPIKey(key) {
    return await (await fetch('http://localhost:8000/' + key)).json();
}

在我的天气对象中:

export default {
    URI: 'https://api.openweathermap.org',
    getLocalWeather: async function(city=null, countryCode=null) {
        try {
            // fetch the API key from environment
            const API_KEY = await getAPIKey('wx');
            //... rest of code

目前的代码有效,但是我不明白为什么我需要3个await语句。我会不需要两个吗?我需要一个用于fetch()中的getAPIKey()。然后.json()返回一个promise,因为它必须等待响应主体,因此我需要等待getLocalWeather()中调用该函数的地方。但是,如果我在getAPIKey()中没有两个等待,它将返回[object Response]吗?

本质上,我想知道为什么以下错误:

export default async function getAPIKey(key) {
    return (await fetch('http://localhost:8000/' + key)).json();
}

在我的天气对象中:

export default {
    URI: 'https://api.openweathermap.org',
    getLocalWeather: async function(city=null, countryCode=null) {
        try {
            // fetch the API key from environment
            const API_KEY = await getAPIKey('wx');
            //... rest of code

我想念吗?因为我只看到两个承诺。我知道async / await函数是幕后的承诺,所以getAPIKey()是一个承诺,但是那个承诺不是.json()的承诺吗?如果是这样,为什么在我调用该函数的地方等待还不够?

我不确定我无法理解的内容。

1 个答案:

答案 0 :(得分:0)

您在await内不需要任何getAPIKey()语句,甚至不需要async就可以了。您可以这样做:

export default function getAPIKey(key) {
    return fetch('http://localhost:8000/' + key).json();
}

您只想退还fetch().json()的承诺。

  

目前的代码有效,但是我不明白为什么我需要3个await语句。我会不需要两个吗?

实际上,您在进行await getAPIKey()时只需要一个。完全不需要getAPIKey()中的其他内容。


当您执行以下操作时:

export default async function getAPIKey(key) {
    return await fetch('http://localhost:8000/' + key).json();
}

您只是添加了一个没有用的多余的await。该函数返回一个诺言(所有async函数都返回一个诺言),并且在完成await时将解决该诺言,这与刚开始时return fetch('http://localhost:8000/' + key).json();完全一样。添加第二个await也不会增加任何值。