多次调用节点google自定义搜索API

问题描述 投票:0回答:2

使用this code作为参考,我尝试制作一个函数,该函数将单词作为输入并将其切成32个单词,并返回不同搜索数据的列表:

async function singleSearch(q, cx, auth) {
   const res = await customsearch.cse.list({
     cx: cx,
     q: q,
     auth: auth,
   });
   return res.data;
 };

function search(words, apikey=process.argv[2], engineid=process.argv[3]){
   const limit = 32; //32 word limit on google search
   var searchQueries = [];
   var len = Math.ceil(words.length/limit);
   for(var i = 0; i < len; i++){
       searchQueries.push( words.slice(i*limit, (i+1)*limit).join(" ") )
   };
   var searches = []
   for(var i = 0; i < searchQueries.length; i++){
       searches.push(singleSearch(searchQueries[i], engineid, apikey).catch(console.error))
   };
   return searches
   }

a = search("Do I understand it correctly that anotherCall() will be called only when someCall() is completed? What is the most elegant way of calling them in parallel?".split(" "));
console.log(a)

此方法无效,并返回Promise { <pending> },无论我尝试多少个await/asyncPromise.all(),我都无法使用它。在这种情况下,调用API的正确方法是什么?

预期输出:

[
    {
  kind: 'customsearch#search',
  url: {
    type: 'application/json',
    template: 'https://www.googleapis.com/customsearch/v1?q={searchTerms}&num={count?}&start={startIndex?}&lr={language?}&safe={safe?}&cx={cx?}&sort={sort?}&filter={filter?}&gl={gl?}&cr={cr?}&googlehost={googleHost?}&c2coff={disableCnTwTranslation?}&hq={hq?}&hl={hl?}&siteSearch={siteSearch?}&siteSearchFilter={siteSearchFilter?}&exactTerms={exactTerms?}&excludeTerms={excludeTerms?}&linkSite={linkSite?}&orTerms={orTerms?}&relatedSite={relatedSite?}&dateRestrict={dateRestrict?}&lowRange={lowRange?}&highRange={highRange?}&searchType={searchType}&fileType={fileType?}&rights={rights?}&imgSize={imgSize?}&imgType={imgType?}&imgColorType={imgColorType?}&imgDominantColor={imgDominantColor?}&alt=json'},
    ...
 },
...
]
javascript node.js asynchronous google-search-api
2个回答
0
投票

由于singleSearch异步函数返回了一个Promise,因此您需要使用then来获取搜索结果,然后将其推送到searches数组。


0
投票

问题是您试图循环执行异步操作,这与您期望的方式不符。您需要使用Promise.all或在等待时使用for..of循环。您可以这样进行Promise.all

© www.soinside.com 2019 - 2024. All rights reserved.