在Javascript异步函数

时间:2018-05-18 14:23:35

标签: javascript asynchronous async-await

我有以下脚本:

async function getJobs () {
    const response = await fetch('https://redhat.jobs/jobs/feed/json');
    json = await response.json();
    console.log("inside getJobs fuction " + json);
}

jobs = getJobs();
console.log("outside getJobs function" + jobs);

第一个console.log按照我的预期显示json响应。但是,对于第二个日志,我在控制台中看到outside getJobs function[object Promise]

我认为这里发生的事情是,在将结果分配给jobs变量之前,我需要等待让getJobs运行/完成?或者从一开始我的做法是完全错误的。

只是为了提供更多上下文,我想要getJobs一次,然后我想在应用程序中使用jobs数组做东西

2 个答案:

答案 0 :(得分:1)

fetch(url)response.json()都返回Promise。你可以用Promises做的是使用.then()语句。这使您可以在Promise解决后执行一些代码 。关于您的上述代码,您会注意到如果您按原样运行它,您会得到:

"outside getJobs function[object Promise]"
"inside getJobs fuction [object Object], [object Object], ..."

这是因为getJobs()返回了一个Promise。所以:

jobs = getJobs();
console.log("outside getJobs function" + jobs);

在收到console.log()的承诺后立即执行getJobs()。只有当Promise 已解决时,您才能获得有用的信息,因此您只需确保在承诺解决后console.log() >

您可以使用.then()语句执行此操作。 Learn more about them here.这允许您同步处理此代码。您甚至不必担心getJobs()异步(这可能会使代码稍微混乱,因为Promise链接工作就好了在我看来)。我会像上面这样实现:

function getJobs() {
    var result = fetch('https://redhat.jobs/jobs/feed/json');
    console.log('result inside getJobs is a Promise')
    return(result)
}

getJobs().then(function(response){
  return response.json();
  })
  .then(function(jobs){
  console.log('result after promise chain is ' + jobs)
  }
);

答案 1 :(得分:0)

您需要创建另一个异步函数,在其中使用await调用getJobs()。 您拥有outside getJobs function[object Promise]的原因是因为在解析承诺之前运行了console.log。

这样做可以解决您的问题:



async function run(){
  async function getJobs () {
      const response = await fetch('https://redhat.jobs/jobs/feed/json');
      json = await response.json();
      return(json);
  }

  jobs = await getJobs();
  console.log(jobs);
 }
 
 run();