2017-08-11 52 views
0

我知道这个话题在很多问题中都有涉及。我已经阅读了其中的许多内容,但无法将信息转化为我的情况,因为有许多Promise框架和发出异步HTTP请求的框架。我读得越多,我就越困惑。所以我恳请您在 任务中寻求帮助。我会尽量保持它尽可能具体。如何将api调用的结果(使用基于承诺的Axios库)返回给调用范围?

这就是我想做的事:

用户输入搜索词,通过提交API调用维基媒体API的,请求该搜索词维基百科页面。这会产生一个页面列表,这些页面可以是普通页面或元页面。我想过滤出元页面。

// the first call to the API, requesting the sources(pages) 
axios.get(url, {params}) 
    .then(function (res) { 
    const html = res.data[1].map((source) => { 
     // here I want to filter meta pages 
     if (isNotMetaPage(source)) { 
     return ` 
      <div class='sources_list_entry'> 
      <p> ${source} </p> 
      </div> 
     ` 
     } 
    }).join('') 

在功能isNotMetaPage()我需要做的另一个API调用维基百科,让页面类型(这是不包括在第一次请求)和一个正常的页面,并为false元页面返回true

function isNotMetaPage (title) { 

    const encodedTitle = encodeURI(title) 
    const query = `?action=query&titles=${encodedTitle}&prop=revisions&rvprop=content&format=json&origin=*` 
    let result 

    axios.get(url.concat(query)) 
    .then(function (response) { 
     const wikiPage = parseWikiMarkup(response) 
     result = (wikiPage.type === 'page') 
    }) 

    return result 
} 

显然,此函数返回undefined,作为请求是异步的,并且结果是在API答复之前返回。将结果记录到then中的控制台时,它具有正确的值。

但是我怎么能暂停执行,直到我有结果回来?我读了很多,我不应该进行同步呼叫,但我怎么能在这里避免它?

感谢您的帮助!

+1

无法“暂停”的JavaScript执行。显然你已经开始理解异步,并且你的数据会在某个时间点晚些时候出现。那么,在这个时候(在'then'中),当你的数据可用时,调用一个测试函数并将数据传递给它。例如'testTheResult(result)'。 –

+0

是的,我明白这个问题,只是不知道如何解决它。我需要这个调用的结果,因为没有它,它返回undefined并且if块永远不会被执行。 – Flip

+0

@Flip没有解决方案。您必须推迟使用结果的代码。 – Bergi

回答

1

你其实可以连锁then()功能,让你的情况,你会做如下:

axios.get(url, {params}) 
    .then(function (res) { 
     const html = res.data[1].map((source) => { 
     // here I want to filter meta pages 
     isNotMetaPage(source).then(function(isNotMeta) { 
      if(isNotMeta){ 
       //do something asynchronously 
      } 
     }); 
}).join('') 


function isNotMetaPage (title) { 

    const encodedTitle = encodeURI(title) 
    const query = `?action=query&titles=${encodedTitle}&prop=revisions&rvprop=content&format=json&origin=*` 

    return axios.get(url.concat(query)) 
     .then(function (response) { 
      const wikiPage = parseWikiMarkup(response); 
      return (wikiPage.type === 'page'); 
    }); 
}