Javascript 多次调用异步函数

Javascript 多次调用异步函数,javascript,node.js,express,Javascript,Node.js,Express,所以我有一个方法,我想在一个循环中多次调用它。这就是功能: function PageSpeedCall(callback) { var pagespeedCall = `https://www.googleapis.com/pagespeedonline/v4/runPagespeed?url=https://${websites[0]}&strategy=mobile&key=${keys.pageSpeed}`; // second call var

所以我有一个方法,我想在一个循环中多次调用它。这就是功能:

function PageSpeedCall(callback) {
    var pagespeedCall = `https://www.googleapis.com/pagespeedonline/v4/runPagespeed?url=https://${websites[0]}&strategy=mobile&key=${keys.pageSpeed}`;
    // second call
    var results = '';
    https.get(pagespeedCall, resource => {
        resource.setEncoding('utf8');
        resource.on('data', data => {
            results += data;
        });
        resource.on('end', () => {
            callback(null, results);
        });
        resource.on('error', err => {
            callback(err);
        });
    });
    // callback(null, );
}
如您所见,这是一个调用PageSpeed API的异步函数。然后通过
回调
获得响应,并将其呈现在视图中。现在我如何让它在for/while循环中工作?比如说

function PageSpeedCall(websites, i, callback) {
    var pagespeedCall = `https://www.googleapis.com/pagespeedonline/v4/runPagespeed?url=https://${websites[i]}&strategy=mobile&key=${keys.pageSpeed}`;
    // second call
    var results = '';
    https.get(pagespeedCall, resource => {
        resource.setEncoding('utf8');
        resource.on('data', data => {
            results += data;
        });
        resource.on('end', () => {
            callback(null, results);
        });
        resource.on('error', err => {
            callback(err);
        });
    });
    // callback(null, );
}

var websites = ['google.com','facebook.com','stackoverflow.com'];
for (let i = 0; i < websites.length; i++) {
    PageSpeedCall(websites, i);
}
我试图使用承诺链,但由于某种原因,我无法在脑海中把它组合起来。这是我的尝试

return Promise.all([PageSpeedCall,MozCall,AlexaCall]).then(([ps,mz,al]) => {
    if (awaiting != null)
        var areAwaiting = true;
    res.render('admin/', {
        title: 'Report',
        // bw: JSON.parse(results[0]),
        ps: JSON.parse(results[0]),
        moz: JSON.parse(results[1]),
        // pst: results[0],
        // mozt: results[1],
        // bw: results[1],
        al: JSON.parse(results[2]),
        user: req.user,
    });
}).catch(e => {
    console.error(e)
});
我试着这样做:

return Promise.all([for(let i = 0;i < websites.length;i++){PageSpeedCall(websites, i)}, MozCall, AlexaCall]).
then(([ps, mz, al]) => {
    if (awaiting != null)
        var areAwaiting = true;
    res.render('admin/', {
        title: 'Report',
        // bw: JSON.parse(results[0]),
        ps: JSON.parse(results[0]),
        moz: JSON.parse(results[1]),
        // pst: results[0],
        // mozt: results[1],
        // bw: results[1],
        al: JSON.parse(results[2]),
        user: req.user,
    });
}).catch(e => {
    console.error(e)
});
returnpromise.all([for(let i=0;i{
如果(等待!=null)
var=true;
res.render('admin/'{
标题:"报告",,
//bw:JSON.parse(结果[0]),
ps:JSON.parse(结果[0]),
moz:JSON.parse(结果[1]),
//pst:结果[0],
//mozt:结果[1],
//bw:结果[1],
al:JSON.parse(结果[2]),
用户:req.user,
});
}).catch(e=>{
控制台错误(e)
});
但诺德只是说这很愚蠢

如果我不想将网站和迭代器传递到函数中,这将起作用。你知道怎么解决这个问题吗

重述。到目前为止,这些功能只适用于单个网站。我希望他们为一系列网站工作


我基本上不知道如何调用它们,以及如何返回响应。

如果使用
fetch
async/wait

const fetch = require('node-fetch');

async function PageSpeedCall(website) {
    const pagespeedCall = `https://www.googleapis.com/pagespeedonline/v4/runPagespeed?url=https://${website}&strategy=mobile&key=${keys.pageSpeed}`;
    const result = await fetch(pagespeeddCall);
    return await result.json();
}


async function callAllSites (websites) {
  const results = [];
  for (const website of websites) {
    results.push(await PageSpeedCall(website));
  }
  return results;
}

callAllSites(['google.com','facebook.com','stackoverflow.com'])
  .then(results => console.log(results))
  .error(error => console.error(error));
有承诺哪一个更好

async function callAllSites (websites) {
  return await Promise.all(websites.map(website => PageSpeedCall(website));
}

如果使用
fetch
async/await

const fetch = require('node-fetch');

async function PageSpeedCall(website) {
    const pagespeedCall = `https://www.googleapis.com/pagespeedonline/v4/runPagespeed?url=https://${website}&strategy=mobile&key=${keys.pageSpeed}`;
    const result = await fetch(pagespeeddCall);
    return await result.json();
}


async function callAllSites (websites) {
  const results = [];
  for (const website of websites) {
    results.push(await PageSpeedCall(website));
  }
  return results;
}

callAllSites(['google.com','facebook.com','stackoverflow.com'])
  .then(results => console.log(results))
  .error(error => console.error(error));
有承诺哪一个更好

async function callAllSites (websites) {
  return await Promise.all(websites.map(website => PageSpeedCall(website));
}
您可以使用本机异步/等待:

async function PageSpeedCall(website) {
  var pagespeedCall = `https://www.googleapis.com/pagespeedonline/v4/runPagespeed?url=https://${website}&strategy=mobile&key=${keys.pageSpeed}`;
  return await promisify(pagespeedCall);
}

async function getResults(){
  const websites = ['google.com','facebook.com','stackoverflow.com'];

  return websites.map(website => {
    try {
      return await PageSpeedCall(website);
    }
    catch (ex) {
      // handle exception
    }
  })
}

功能提示(url){
//返回新的待定承诺
返回新承诺((解决、拒绝)=>{
//根据请求的url选择http或https模块
const lib=url.startsWith('https')?require('https'):require('http');
const request=lib.get(url,(响应)=>{
//处理http错误
if(response.statusCode<200 | | response.statusCode>299){
拒绝(新错误('加载页面失败,状态代码:'+response.statusCode));
}
//临时资料持有人
常量体=[];
//在每个内容块上,将其推送到数据数组
response.on('data',(chunk)=>body.push(chunk));
//我们完成了,用这些连接块来解决承诺
response.on('end',()=>resolve(body.join(''));
});
//处理请求的连接错误
请求.on('error',(err)=>拒绝(err))
})
}
您可以使用本机异步/等待:

async function PageSpeedCall(website) {
  var pagespeedCall = `https://www.googleapis.com/pagespeedonline/v4/runPagespeed?url=https://${website}&strategy=mobile&key=${keys.pageSpeed}`;
  return await promisify(pagespeedCall);
}

async function getResults(){
  const websites = ['google.com','facebook.com','stackoverflow.com'];

  return websites.map(website => {
    try {
      return await PageSpeedCall(website);
    }
    catch (ex) {
      // handle exception
    }
  })
}

功能提示(url){
//返回新的待定承诺
返回新承诺((解决、拒绝)=>{
//根据请求的url选择http或https模块
const lib=url.startsWith('https')?require('https'):require('http');
const request=lib.get(url,(响应)=>{
//处理http错误
if(response.statusCode<200 | | response.statusCode>299){
拒绝(新错误('加载页面失败,状态代码:'+response.statusCode));
}
//临时资料持有人
常量体=[];
//在每个内容块上,将其推送到数据数组
response.on('data',(chunk)=>body.push(chunk));
//我们完成了,用这些连接块来解决承诺
response.on('end',()=>resolve(body.join(''));
});
//处理请求的连接错误
请求.on('error',(err)=>拒绝(err))
})
}

做出
PageSpeedCall
承诺,并根据需要将该承诺推送到数组中,例如
myArray.push(PageSpeedCall(foo))
然后
myArray.push(PageSpeedCall(foo2))
等等。那你保证,所有的阵列

如果后续异步调用需要先前异步调用的结果,这就是
。那么
适用于


做出
PageSpeedCall
承诺,并根据需要多次将该承诺推送到数组中,例如
myArray.push(PageSpeedCall(foo))
然后
myArray.push(PageSpeedCall(foo2))
等等。那你保证,所有的阵列

如果后续异步调用需要先前异步调用的结果,这就是
。那么
适用于


我喜欢这个,但我只是说它很愚蠢。英雄联盟无论如何,这正是Async/Await被引入JavaScript的原因。你可能会发现这很有帮助:我需要阅读整个
async
then
的内容。谢谢我喜欢这个,但我只是说它很愚蠢。英雄联盟无论如何,这正是Async/Await被引入JavaScript的原因。你可能会发现这很有帮助:我需要阅读整个
async
then
的内容。谢谢哇,这太棒了!谢谢我从来没有想过你可以像这样使用
promises
async/await
在每个函数的末尾做
return-await something()
比把它作为
return something()有什么好处
作为异步函数的返回值?最终等待没有任何作用,因为返回承诺也有同样的作用。然而,我个人喜欢把它包括在内,以清晰和更容易重构。哇,这太棒了!谢谢我从来没有想过你可以像这样使用
promises
async/await
在每个函数的末尾做
return-await something()
比把它作为
return something()有什么好处
作为异步函数的返回值?最终等待没有任何作用,因为返回承诺也有同样的作用。不过,我个人喜欢将其包括在内,以使其更清晰、更易于重构。