Вызов API и обратные вызовы - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь создать маршрут, который выполняет 2 вызова API, второй зависит от результатов первого и должен вызываться только при соблюдении определенных критериев. Ниже приведены проблемы, с которыми я сталкиваюсь.

  1. Функция finalCheck, кажется, вызывается перед forEach, несмотря ни на что? Даже если в операторе if
  2. Счетчик и userNamesAvailable недоступны вне области видимости они назначены в.
  3. Я уверен, что есть лучший способ сделать это, и я хотел бы любой советы.

    router.post('/namecheck', async function(req, res, next) {   
      var name = req.body.name;
      var counter = 0
      var domains = []
      var userNamesAvailable = []
      var dotcom = true
      var answer = ''
    
    getDomains(checkDomains)
    
    // Check domain availabilty
    function getDomains (callback) {
      var url='https://api.ote-godaddy.com/v1/domains/available?checkType=FAST'
      Unirest.post(url)
        .headers({
          "Authorization" : "sso-key ",
          "Content-Type": "application/json"
        })
        .send(
          [
            name + '.com',
            name + '.net',
            name + '.org'
          ]
        )
        .end(function(response) { 
          domains=response.body.domains
          console.log(domains)
          callback(domains)
        })
    
    }
     function checkDomains(domains) {
       var d = 0
    
    //If no data is returned send error
    if(!domains) 
    {
      console.log("No data returned")
      return next("No data returned")
    } else {
      //Check how many domains are unavailable
      for(var i=0; i < domains.length; i++) {
        if(domains[i].available == false){
          d = d + 1
          //Flag if the .com is available
          if(domains[i].domain == name + '.com') {
            dotcom = false
          }
        }
      }
    
      if (d >2) {
        console.log("d is greater than 1")
        answer = 'no'
      //If 2 domains are available and one is .com continue
      } else if (d>1 && dotcom =='false') {
        answer = 'no'
      }
    }
    getUsernames(finalCheck)
    }
    
    function getUsernames(callback){
      // Social Sites to Check
      var sitenames = [ 
        'facebook',
        'twitter',
        'instagram',
        'youtube',
        'slack',
        'blogger'
      ]
    
      // Check Usename availabitliy
      let i = 0
      sitenames.forEach(sitename => {
    
      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)
        }
      });
      i++
    });
    console.log(counter)
    console.log(userNamesAvailable)
    if(i == sitenames.length){
      callback(counter, dotcom)
     }
    }
    
    function finalCheck(counter, dotcom) {
      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")
        }
      }
     })
    

1 Ответ

0 голосов
/ 31 октября 2018

После ответа на этот вопрос . Вы должны быть в состоянии сделать это, используя Promise.

Вы должны изменить только функцию getUsernames.

  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). Постарайтесь сначала понять их, и вы заметите, что они являются большим преимуществом.

Есть много документации о них там ... асинхронная функция понимание обещаний

РЕДАКТИРОВАТЬ: Не отправляйте переменные, которые вы вызываете global в качестве параметров, они уже доступны в вызываемой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...