Javascript 无法读取属性';地图';即使在控制台中以异步方式正确获取API后,仍存在未定义的
嗨,我正在尝试使用JS创建一个基于API的新闻搜索webapp。这是我得到错误的函数Javascript 无法读取属性';地图';即使在控制台中以异步方式正确获取API后,仍存在未定义的,javascript,asynchronous,Javascript,Asynchronous,嗨,我正在尝试使用JS创建一个基于API的新闻搜索webapp。这是我得到错误的函数 async function fetchUsers(searchTerm, searchLimit, sortBy){ //RETURNS PROMISES let url=`some api parameters searchTerm, SearchLimit and sorby is passed`; const res=await fetch(url); const data=await res.jso
async function fetchUsers(searchTerm, searchLimit, sortBy){
//RETURNS PROMISES
let url=`some api parameters searchTerm, SearchLimit and sorby is passed`;
const res=await fetch(url);
const data=await res.json();
const article = [];
document.getElementById("container").innerHTML=`
${data.article.map(function(post){
//NEWSCARD
return(`
<ul id="news-article" style="list-style-type:none;">
<li class="article">
<div class="card mb-2">
<img class="article-image" class="card-img-top" src="${post.urlToimage}" alt="Card image cap">
<div class="card-body">
<h2 class="article-title" class="card-title">${post.title}</h2>
<p class="article-description" class="card-text">${truncateString(post.selftext, 100)}</p>
<a class="article-link" href="${post.url}" target="_blank
" class="btn btn-primary">Read More</a>
<hr>
<span class="article-author" class="badge badge-secondary">Subreddit: ${post.subreddit}</span>
<span class="badge badge-dark">Score: ${post.score}</span>
</div>
</div>
</li>
</ul>
`)
}
.join('')
)}} fetchUsers();
异步函数fetchUsers(searchTerm、searchLimit、sortBy){
//回报承诺
让url=`一些api参数searchTerm、SearchLimit和sorby被传递';
const res=等待获取(url);
const data=wait res.json();
常量条=[];
document.getElementById(“容器”).innerHTML=`
${data.article.map(函数(post){
//新闻卡
返回(`
-
${post.title}
${truncateString(post.selftext,100)}
Subreddit:${post.Subreddit} 分数:${post.Score}
感谢发生的事情是正在异步调用document.getElementByid节,可能是在数据没有返回任何内容,或者甚至没有声明article变量时,您可以尝试以下操作:
async function getData() {
const res = await fetch(url);
const data = await res.json();
populateList(data);
}
function populateList(article) {
const innerHTML = article.map(post => `
<ul id="news-article" style="list-style-type:none;">
<li class="article">
<div class="card mb-2">
<img class="article-image" class="card-img-top" src="${post.urlToimage}" alt="Card image cap">
<div class="card-body">
<h2 class="article-title" class="card-title">${post.title}</h2>
<p class="article-description" class="card-text">${truncateString(post.selftext, 100)}</p>
<a class="article-link" href="${post.url}" target="_blank" class="btn btn-primary">Read More</a>
<hr>
<span class="article-author" class="badge badge-secondary">Subreddit: ${post.subreddit}</span>
<span class="badge badge-dark">Score: ${post.score}</span>
</div>
</div>
</li>
</ul>
`);
document.getElementById('container').innerHTML = innerHTML;
}
异步函数getData(){
const res=等待获取(url);
const data=wait res.json();
民众名单(数据);
}
函数populateList(文章){
const innerHTML=article.map(post=>`
-
${post.title}
${truncateString(post.selftext,100)}
Subreddit:${post.Subreddit} 分数:${post.Score}
您也可以在不使用
async
和wait
关键字的情况下执行此操作,只需在语句中使用回调即可。然后
语句如下:
function fetchUsers(searchTerm, searchLimit, sortBy){
let url=`some url based on params`;
fetch(url)
.then( res => res.json() )
.then( data => populateList(data) )
}
function populateList(data) {
const innerHTML = data.articles.map(post => `
<ul id="news-article" style="list-style-type:none;">
<li class="article">
<div class="card mb-2">
<img class="article-image" class="card-img-top" src="${post.urlToimage}" alt="Card image cap">
<div class="card-body">
<h2 class="article-title" class="card-title">${post.title}</h2>
<p class="article-description" class="card-text">${truncateString(post.selftext, 100)}</p>
<a class="article-link" href="${post.url}" target="_blank" class="btn btn-primary">Read More</a>
<hr>
<span class="article-author" class="badge badge-secondary">Subreddit: ${post.subreddit}</span>
<span class="badge badge-dark">Score: ${post.score}</span>
</div>
</div>
</li>
</ul>
`);
document.getElementById('container').innerHTML = innerHTML;
}
fetchUsers(searchTerm, searchLimit, sortBy);
函数fetchUsers(searchTerm、searchLimit、sortBy){
让url=`基于参数的某个url`;
获取(url)
.then(res=>res.json())
.然后(数据=>populateList(数据))
}
函数populateList(数据){
const innerHTML=data.articles.map(post=>`
-
${post.title}
${truncateString(post.selftext,100)}
Subreddit:${post.Subreddit}
分数:${post.Score}
`);
document.getElementById('container')。innerHTML=innerHTML;
}
fetchUsers(searchTerm、searchLimit、sortBy);
另外,劫持Misir Jafarov的评论,你的数据
对象中的数组被称为文章
,但是你试图从文章
映射。我觉得如果没有这个打字错误,你仍然会有问题,但这肯定会让你挂断。谢谢@Misir Jafarov这个问题(通过观察控制台中的错误)您的代码试图访问一个不存在的属性
如果无法访问您正在使用的确切数据,就不可能通知您确切的问题是什么。但是,以下是我将采取的一些步骤来诊断问题:
数据
后立即设置断点(调试器
)或控制台.log(data)
,以便您可以观察它数据
变量,或者检查代码以编程方式做出的假设typeof data
应返回object
对象(数据)。hasOwnProperty('article')
array.isArray(data.article)
数据
中的每一篇文章
都有自文本
,子Reddit
,分数
(使用步骤2)我的猜测是,在这个过程中,您会发现代码和数据之间存在不一致。如果没有,我想知道您的位置。缩小范围并找到问题的唯一方法是首先以干净的方式编写代码 我建议您将代码分解为可管理的部分,并尝试使用调试器或控制台在浏览器中调试功能。log()工作得非常好 还有更好的选择,比如你可以在哪里编写代码,并在代码的帮助下进行测试,以获得更多的信心
注意:伪代码
函数getPosts(){
返回岗位
}
函数renderPost(post){
返回`${post}`
}
函数render(){
const posts=getPosts()
console.info('post->',posts)
const postsMarkup=posts.map((post)=>renderPost(post)).join(“”);
console.info('postsMarkup->',postsMarkup)
document.getElementById('container').innerHTML=邮戳
}
也许可以检查数据是否不为空?什么是res.json()
返回?是否有.article
在其中?是否为空?请显示您的api响应。我尝试使用console.log检查数据,它在控制台中正确返回api的数据。如何异步调用其函数中的一段代码?不确定
NOTE: pseudo code
function getPosts() {
return posts
}
function renderPost(post) {
return `<div>${post}</div> `
}
function render() {
const posts = getPosts()
console.info('post -> ', posts)
const postsMarkup = posts.map((post) => renderPost(post)).join('');
console.info('postsMarkup -> ', postsMarkup)
document.getElementById('container').innerHTML = postMarkup
}