提问者:小点点

Promise函数不返回结果


我正在使用Instagram-Scraping模块来显示所有带有特定哈希标记的帖子,但是在使用函数返回查找到的条目时遇到了一个问题。

// in my middleware
function getInstagramPostsByHashTag(hashtag) {
  return ig.scrapeTag(hashtag).then(result => {
    console.log(result); // all posts are displayed in my console
    return result;
  });
}

// in my ejs template i send the function getInstagramPostsByHashTag()
<%=getInstagramPostsByHashTag("instagram")%> // nothing is displayed

共1个答案

匿名用户

您不能从函数返回帖子,因为此时函数已经返回了。这是因为.then()是异步的。当工作(获取post)完成时,它会执行提供的回调,但是函数在调用.then()之后会继续运行,因为没有返回任何东西,所以没有得到任何东西。

如果希望函数返回异步操作的结果,则必须从函数本身返回一个承诺。为了帮助开发人员实现这一点,有一个异步函数,它自动返回一个承诺。在异步函数中,可以使用await关键字等待其他承诺。您的函数将类似于异步函数:

async function getInstagramPostsByHashTag(hashtag) {
  return await ig.scrapeTag(hashtag)
}

但这是多余的,因为它返回的结果与直接调用ig.scrapetag(hashtag)的结果完全相同。我并不真正了解ejs,但我认为您可以做的最好的事情是这样的(只是伪代码,再说一遍,我不知道用ejs呈现是如何工作的):

posts = insta.scrapeTag("blablabla")
    then
        ejs.render("<%=posts%>", {posts})