首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >API调用和回调

API调用和回调
EN

Stack Overflow用户
提问于 2018-10-31 04:41:00
回答 1查看 1.2K关注 0票数 0

我正在尝试创建一个进行2个API调用的路由,第二个依赖于第一个API调用的结果,只有在满足特定条件时才需要调用。下面是我遇到的问题。

  1. finalCheck函数似乎无论如何都会在forEach之前被调用?即使将计数器和userNamesAvailable包装在if语句中,计数器和userNamesAvailable也不会超出它们的赋值范围。
  2. 我相信有更好的方法可以做到这一点,我希望得到任何相关的建议。

router.post('/namecheck',异步函数(req,res,next) { var name = req.body.name;var计数器=0 var domain = [] var userNamesAvailable = [] var dotcom = true var answer = '‘getDomains(checkDomains) //检查域名可用性函数getDomains (回调){ var url='https://api.ote-godaddy.com/v1/domains/available?checkType=FAST’Unirest.post(url) .headers({“授权”:"sso-key ",“内容类型”:“应用程序/json”}) .send(名称+ '.com',名称+ '.net',name + '.org‘) .end( function (response) { domains=response.body.domains console.log(domains) callback(domains) }) }function checkDomains(domains) { var d=0//如果未返回数据,则发送error if(!domains) { console.log("No data returned") return next("No data returned") } else {//Check有多少域不可用(var i=0;I< domains.length;i++) { if(domainsi.available == false){ d=d+1// .com可用的标志if(domainsi.domain == name + ' .com ') { dotcom = false }} if (d >2) { console.log("d大于1") answer = 'no‘//如果有两个域可用,其中一个是.com继续}(d>1 && dotcom =='false') { answer = 'no‘}} getUsernames(finalCheck) }函数回调(GetUsernames){ //检查网站名称的社交网站= 'facebook',‘'twitter','instagram','youtube','slack','blogger’//查看可用的用户名,让i=0 sitenames.forEach(站点名称=> { Unirest.post('https://api.namechk.com/services/check.json') .headers({ 'AUTHORIZATION':‘承载','Accept':’应用程序/vnd.api.v1+json‘,}).send({’站点‘:站点名称,用户名:名称,}).end(function(response) { if(response.body.available == false){ counter ++ } else { userNamesAvailable.push(response.body) } });i++ });Console.log(计数器) console.log(userNamesAvailable) if(i == sitenames.length){ callback(counter,dotcom) }}函数finalCheck(计数器,dotcom) { console.log('Start finalCheck') console.log(counter) console.log( dotcom ) //最终检查是不是一个名字//如果一个社交网站不可用并且if(counter == 1 && dotcom =='true') { console.log(5-counter +‘社交网站可用’)res.send(“是”);} else { res.send("no") })

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-31 05:15:22

this question上关注答案。你应该能够使用Promise来做这件事。

您只需更改函数getUsernames

代码语言:javascript
复制
  function getUsernames(callback) {
    // Social Sites to Check
    var sitenames = [
      'facebook',
      'twitter',
      'instagram',
      'youtube',
      'slack',
      'blogger'
    ];

    // Check Usename availabitliy
    let requests = sitenames.map((sitename) => {
      return new Promise((resolve) => {
        Unirest.post('https://api.namechk.com/services/check.json')
          .headers({
            'AUTHORIZATION': 'Bearer ',
            'Accept': 'application/vnd.api.v1+json',
          }).send({
            'site': sitename,
            username: name,
          }).end(function(response) {
            if (response.body.available == false){
              counter++;
            } else {
              userNamesAvailable.push(response.body);
            }
            resolve();
          });
      });  
    });

    Promise.all(requests).then(() => { 
      console.log(userNamesAvailable);
      callback(counter, dotcom);
    });
  }

  function finalCheck() {
    console.log('Start finalCheck')
    console.log(counter)
    console.log(dotcom)
    //Final Check for is a name is a go or not
    //If one social site is not available and the
    if (counter == 1 & dotcom == 'true') {
      console.log(5 - counter + ' social sites available')
      res.send("yes");
    } else {
      res.send("no")
    }
  }

请记住,javascript中的异步函数是一个特性,而不是您应该对抗的东西(我认为您正在尝试将您的主函数声明为async function)。首先试着理解它们,你会发现它们是一个很大的优势。

有很多关于它们的文档……async Fucntion understanding Promises

编辑:不要将您调用的全局变量作为参数发送,它们已经在被调用的函数中可用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53072591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档