Javascript 将AWIS调用更改为异步函数
我有这个功能:Javascript 将AWIS调用更改为异步函数,javascript,node.js,express,asynchronous,Javascript,Node.js,Express,Asynchronous,我有这个功能: function AlexaCall(website) { var awis = require('awis'); var client = awis({ key: keys.alexa.public, secret: keys.alexa.secret, }); let responseData = []; client({ Action: 'UrlInfo', 'Ur
function AlexaCall(website) {
var awis = require('awis');
var client = awis({
key: keys.alexa.public,
secret: keys.alexa.secret,
});
let responseData = [];
client({
Action: 'UrlInfo',
'UrlInfo.Shared.ResponseGroup': 'Rank',
'UrlInfo.1.Url': 'lupomontero.com',
'UrlInfo.2.Url': 'yahoo.com',
'UrlInfo.3.Url': 'weibo.com',
'UrlInfo.4.Url': 'github.com',
'UrlInfo.5.Url': 'monono.org'
}, (err, data) => {
// res.length === 5
// data is an array with a response object for each domain
data.forEach(function (item) {
//res.write(item.trafficData.dataUrl);
responseData.push(item);
});
console.log(responseData);
callback(null, JSON.stringify(responseData));
});
}
是否可以将其编辑为与此类似的行为
async function PageSpeedCall(website) {
var pagespeedCall = `https://www.googleapis.com/pagespeedonline/v4/runPagespeed?url=https://${website}&strategy=mobile&key=${keys.pageSpeed}`;
// second call
var results = await fetch(pagespeedCall);
return await results.json();
}
第一种方法使用。文档非常清楚,但我需要能够调用如下函数:
async function callAllSites(websites) {
var psRes = [];
var mozRes = [];
for (let website of websites) {
psRes.push(await PageSpeedCall(website));
mozRes.push(await MozCall(website));
}
return await {'ps': psRes, 'moz': mozRes};
// return await [psRes, mozRes];
// return psRes;
}
callAllSites('google.com','stackoverflow.com')
.then(results => {
// console.log(results.ps[3].error)
// console.log(results.error)
// console.log(results.ps[0].formattedResults.ruleResults)
console.log(results);
})
.catch(error => console.log(error))
.then(() => console.log('done'));
我需要传递
websites[]
数组,因为这是视图中的内容,用户可以向其中传递多个值。你知道如何解决这个问题吗?这里有一个手动提示的例子
const awis = require('awis');
async function AlexaCall(website) {
const client = awis({
key: keys.alexa.public,
secret: keys.alexa.secret,
});
let responseData = [];
return new Promise(function (resolve, reject) {
client({
Action: 'UrlInfo',
'UrlInfo.Shared.ResponseGroup': 'Rank',
'UrlInfo.1.Url': 'lupomontero.com',
'UrlInfo.2.Url': 'yahoo.com',
'UrlInfo.3.Url': 'weibo.com',
'UrlInfo.4.Url': 'github.com',
'UrlInfo.5.Url': 'monono.org'
}, (err, data) => {
if (err) {
return reject(err);
}
// res.length === 5
// data is an array with a response object for each domain
data.forEach(function (item) {
//res.write(item.trafficData.dataUrl);
responseData.push(item);
});
console.log(responseData);
resolve(JSON.stringify(responseData));
});
});
}
async/await与承诺一起工作(异步函数返回承诺,await等待承诺),因此您只需将
awis
的回调api转换为承诺api,它有许多npm模块,搜索“promisify”恐怕不是那么简单,就是我不明白。promisify接受等待回调的函数,在我的例子中,我只调用一个函数。const client=promisify(awis({key,secret}));const data=等待客户端(查询)代码>awais返回一个回调函数,您将该回调函数包装成一个承诺,然后您可以等待它。它确实进行了调用。问题是我得到了错误:XML响应缺少aws:response代码>。你知道这是怎么回事吗?好的,我这边有一些逻辑问题,但是代码似乎可以工作。谢谢