如何解决限制对外部 api 节点的调用
我在 node 中,我有一个 obj {suggestion: 'text',rank: '2'}
数组,我想用它来调用 bing 以获取每个对象的第一个结果。
目前,我使用 Promise.all
await Promise.all(suggestions.map(async (s,i) => await bingWebSearch(s.suggestion.replace(/\s/g,'+'),i)))
.then(r => {
suggestions.map((s,i) => console.log(`
n${i+1}. ${s.suggestion} | times suggested: ${s.rank} | url: ${s.webpage}
`))
})
.catch(e => e.message)
这将调用函数 bingWebSearch 并将网站 URL 分配给 obj
const bingWebSearch = async (query,i) => {
return await axios.get('https://api.bing.microsoft.com/v7.0/search?',{
headers: {
'Ocp-Apim-Subscription-Key': SUBSCRIPTION_KEY
},params: {
count: 1,mkt: 'en-US',q: query
}
}).then(r => {
if (r.data.webPages) return suggestions[i].webpage = r.data.webPages.value[0].url
}).catch(e => console.log(e.message))
}
所以基本上,这会向 bing 发出 30 次调用,但我只允许每秒调用 3 次,我该如何实现?我尝试过 setTimeOut,但使用 async func 有点棘手,所以它不起作用。
解决方法
这是我的建议:
function delay(ms) {
return new Promise(function (resolve) {
setTimeout(resolve,ms);
});
}
const bingWebSearch = (query,ms) => {
return new Promise((resolve,reject) => {
delay(ms).then(() => {
axios
.get("https://api.bing.microsoft.com/v7.0/search?",{
headers: {
"Ocp-Apim-Subscription-Key": SUBSCRIPTION_KEY
},params: {
count: 1,mkt: "en-US",q: query
}
})
.then(r => {
resolve(r.data.webPages.value[0].url);
})
.catch(e => {
console.log(e.message);
// this will just return an empty string as a result,if something goes wrong
resolve("");
// you can also reject and handle the exception inside calling for loop
// if more advanced error handling is required
// reject(e);
});
});
});
};
async function load() {
const requests = suggestions.map((s,i) => {
// delay each request by 400ms to avoid hitting the limit of 3 requests per second
const ms = i * 400;
return bingWebSearch(s.suggestion.replace(/\s/g,"+"),ms);
});
const res = await Promise.all(requests);
suggestions.forEach((s,i) => {
s.webpage = res[i];
console.log(`n${i + 1}. ${s.suggestion} | times suggested: ${s.rank} | url: ${s.webpage}`);
});
}
(function () {
load();
})();
我稍微重构了 bingWebSearch
,只返回结果,而不直接更改建议列表。尽量保持函数自包含,没有外部依赖。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。