使用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/async
或Promise.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'},
...
},
...
]
由于singleSearch
异步函数返回了一个Promise,因此您需要使用then
来获取搜索结果,然后将其推送到searches
数组。
问题是您试图循环执行异步操作,这与您期望的方式不符。您需要使用Promise.all
或在等待时使用for..of
循环。您可以这样进行Promise.all
。