异步函数返回未决的承诺

时间:2021-01-27 04:43:42

标签: javascript node.js async-await es6-promise

我不明白为什么我得到 Promise { <pending> },因为我使用了 async/await

这是我的代码

const  fetch = require("node-fetch")

function getRandomPokemon() {
    var pokemonID = Math.floor(Math.random() * 851);
    console.log("The Pokemon Id is " + pokemonID);
    return pokemonID
}

async function getJSON() {
    let response = await fetch('https://pokeapi.co/api/v2/pokemon/'+ pokemonID);
    var json = await response.json
}

var pokemonID = getRandomPokemon()
var json = getJSON()
console.log(json)

4 个答案:

答案 0 :(得分:3)

三个问题:

  1. getJSON() 不返回任何内容。它需要以 return json; 结尾。
  2. 声明一个函数 async 使其返回一个 promise。如果你想直接得到返回值而不是一个promise,你必须用await getJSON()来调用它。只有当您从另一个异步函数调用它时才能这样做。
  3. 您需要调用 response.jsonvar json = response.json();

答案 1 :(得分:1)

所有 async 函数都会返回一个 promise - 始终。在 await 函数内使用 async 会挂起该函数的执行,直到您等待的承诺解决或拒绝,但 async 函数不会阻止外部世界。 await 不怀疑整个 js 解释器的执行。

await 函数中的第一个 async 处,您的函数向调用方返回一个承诺,并且调用方继续执行。当函数最终在未来某个时候完成其工作时,该承诺会被解决或拒绝。

<块引用>

我不明白为什么我得到 Promise { } 因为我使用了 async/await

因为所有 async 函数都返回一个 promise。


您的代码中有很多问题:

  1. 您的 getJSON() 函数没有返回值。这意味着它返回的 promise 会解析为 undefined,因此无法返回其值。
  2. await response.json 必须是 await response.json()
  3. pokemonID 应该作为参数传递,而不仅仅是填充到更高范围的变量中。
  4. 调用 getJSON() 时,您必须对其使用 .then()await 才能从返回的 Promise 中获取已解析的值。

您可能还注意到您的 getJSON() 函数没有返回值。这意味着它返回的承诺也解析为 undefined。而且,await response.json 必须是 await response.json()

您的代码需要更像这样:

async function getJSON(id) {
    const response = await fetch('https://pokeapi.co/api/v2/pokemon/'+ id);
    const json = await response.json();
    return json;
}

const pokemonID = getRandomPokemon();
getJSON(pokemonID).then(data => {
    console.log(data);
}).catch(err => {
    console.log(err);
});

答案 2 :(得分:-1)

response.json 应该是一个函数。

在您的 getJSON 函数定义中,您正在执行 await response.json。 将其更改为 await response.json()

注意 json() 后面的括号

由于 getJSON 函数返回 promise,您必须等待响应

在倒数第二行,添加 var json = await getJSON();

此外,为了使用 await,您必须将代码包装在异步函数中

将最后一行和倒数第二行包裹在一个异步函数中

async function resolveJSON(){
    var json = await getJSON(); // waits for the promise to fulfill
    console.log(json);
}

答案 3 :(得分:-1)

只是一些变化

  1. 在 getJSON() 函数中添加 return 语句
  2. 使用 .json() 函数从 getJSON() 中的响应中获取 json
  3. 处理 promise 的一种方法是使用 .then()。您也可以使用 await,但要确保它在 await 块内。
const fetch = require('node-fetch');

function getRandomPokemon() {
  var pokemonID = Math.floor(Math.random() * 851);
  console.log('The Pokemon Id is ' + pokemonID);
  return pokemonID;
}

async function getJSON() {
  let response = await fetch('https://pokeapi.co/api/v2/pokemon/' + pokemonID);
  var json = await response.json();
  return json
}

var pokemonID = getRandomPokemon();
getJSON().then((json) => {
  console.log(json);
});