我有以下脚本:
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数组做东西。
答案 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();