Javascript fetch()请求返回挂起的承诺,而不是最终值

Javascript fetch()请求返回挂起的承诺,而不是最终值,javascript,node.js,asynchronous,fetch,es6-promise,Javascript,Node.js,Asynchronous,Fetch,Es6 Promise,恐怕我对异步性、承诺和获取请求感到很不安 我试图从一个fetch请求中获取数据,这很简单,但在运行它时,我得到的只是“Promise{pending}”。我已经读了10多个答案,这些答案似乎与我的非常相似,但似乎都不起作用 当我在final-then()中输入console.log(data.formatted_address)时,我得到的结果很好(在挂起的承诺之后),但是当我返回它时,在final-console.log中只有“Promise{pending}”。任何帮助都将不胜感激 cons

恐怕我对异步性、承诺和获取请求感到很不安

我试图从一个fetch请求中获取数据,这很简单,但在运行它时,我得到的只是“Promise{pending}”。我已经读了10多个答案,这些答案似乎与我的非常相似,但似乎都不起作用

当我在final-then()中输入console.log(data.formatted_address)时,我得到的结果很好(在挂起的承诺之后),但是当我返回它时,在final-console.log中只有“Promise{pending}”。任何帮助都将不胜感激

const fetch = require('node-fetch');
const dotenv = require('dotenv');
dotenv.config();

function getCoordinates(address) {
  let searchAddress = address.split(" ").join("+");
  let url =
    "https://maps.googleapis.com/maps/api/geocode/json?address=" +
    searchAddress +
    "&key=" + process.env.GOOGLE_API;
  return fetch(url)
    .then(response => response.json())
    .then(data => data.results[0].formatted_address)
}

let a = getCoordinates("Buckingham Palace, London")

console.log(a)
编辑:

如果你想在家里试用的话,这里有一个没有API调用的更简单的版本

function getCoordinates() {
  var promiseTest = new Promise(function(resolve, reject) {
    if (1 + 1 === 2) {
      resolve('pass')
    } else {
      reject('fail')
    }
  })
  return promiseTest.then(data => data);
}

console.log(getCoordinates())
进一步编辑:

所以我认为我认为承诺和异步性是错误的。我需要读一读关于那个的书。我将不再使用异步函数,而是扩展我的承诺以包括回调。但是谢谢大家的帮助

试试这个:

function getCoordinates(address) {
  let searchAddress = address.split(" ").join("+");
  let url =
    "https://maps.googleapis.com/maps/api/geocode/json?address=" +
    searchAddress +
    "&key=" + 'your key'
    return fetch(url);
}

getCoordinates('Buckingham Palace, London').then(res => res.json()).then(data => {
  console.log(data)
})

如果你想得到一个承诺的结果,就像它是一个同步调用一样,你需要使用

简化的示例可能类似于:

function getCoordinates() {
  var promiseTest = new Promise(function(resolve, reject) {
    if (1 + 1 === 2) {
      resolve('pass')
    } else {
      reject('fail')
    }
  })
  return promiseTest.then(data => data);
}

async function getAsyncData() {
    var data = await getCoordinates()
    console.log(data);
    return data;
}

getAsyncData()

注意:async/await在Internet Explorer上不起作用

try
getCoordinates(“伦敦白金汉宫”)。然后(console.log)刚刚试过。。。还有这个。getCoordinates(“伦敦白金汉宫”)。然后(data=>console.log(data)),它们都给出了未定义的数据@TimothyCole您是否可以随时共享用于测试代码的api密钥,您可以随时删除此密钥并生成一个新的密钥。\n如果他们给出
未定义的
,则似乎
数据。结果[0]。格式化的\u地址
也未定义,我恐怕不需要。不过,它确实起作用了。当我使用.then(data=>console.log(data.results[0].格式化的_地址))时,我得到了“英国伦敦威斯敏斯特SW1A 1AA”。我想你可以在承诺中放弃任何东西。是的,这是可行的,但它并不能让我真正做我想做的事情,即从承诺中返回一个值。它只是将问题传递到getCoordinates函数外部。您可以在then块中进一步完成工作?@TimothyCole由于Javascript的设计方式,您希望能够完成的工作是不可能的。您需要将依赖于该
数据的所有内容都放在
内。然后()
回调。