【问题标题】:Changing AWIS call into async function将 AWIS 调用更改为异步函数
【发布时间】:2018-04-07 20:09:02
【问题描述】:

我有这个功能:

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();
}

第一个使用AWIS package。文档很清楚,但我需要能够像这样调用函数:

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[] 数组,因为这是视图中的内容,用户可以向其中传递多个值。知道如何解决这个问题吗?

【问题讨论】:

  • async/await 与 Promises 一起工作(异步函数返回一个 Promise,await 等待一个 Promise)所以你只需要将 awis 的回调 api 转换为 Promise api,有许多npm 模块,搜索“promisify”
  • 恐怕不是那么简单,或者我不明白。 promisify 接受等待回调的函数,就我而言,我只是调用一个。
  • const client = promisify(awis({key, secret})); const data = await client(query); awais 返回一个回调函数,你将这个回调函数包装成一个promise,然后你就可以等待它了。

标签: javascript node.js express asynchronous


【解决方案1】:

这是一个手动承诺的例子。

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));
      });
    });
}

【讨论】:

  • 好吧,它确实打了电话。问题是我收到Error: XML response missing aws:Response!。知道那是什么意思吗?
  • 好的,我这边/有一些逻辑问题,但代码似乎可以工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-01-14
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 2012-07-25
  • 2021-08-07
相关资源
最近更新 更多