2015-07-16 2 views
1

Я новичок в Javascript. Я пытаюсь управлять несколькими функциями в порядке. Но когда он доходит до вызовов API, он не ждет ответа и возвращается назад, чтобы продолжить его выполнение и делает мой код грязным. Это пример:Как я могу контролировать выполняемые функции?

function readFacebook() 
{ 
    var myID = getMyID(); 
    console.log("myID= " + myID); 
} 

function getMyID(){ 
     FB.api('/me', function(response) { 
     console.log("response.id= "+response.id); 
     return(response.id); 
    }); 

} 

Выход совершенно странный. Первый

console.log("myID= " + myID); 

показать выход, а затем

console.log("response.id= "+response.id); 

будет называться. Любой может объяснить, как я могу заставить его реализовать по порядку. Я имел в виду, что программа должна ждать ответа от facebook вместо работы асинхронно!

EDIT

Я на самом деле назвать 3 времени API от основной функции трех вспомогательных функций. Как я могу организовать это:

function getMyID(){ 
      FB.api('/me', function(response) { 
      console.log("response.id= "+response.id); 
      return(response.id); 
     }); 

    } 

function readFacebookEvent(id) 
{ 
    var myID = getMyID(); 
    console.log("myID= " + myID); 
    FB.api('/me/events', function(response) { 

     for(i=0; i<response.data.length;i++) { 
      var str; 
      var eventID = response.data[i].id; 
      getEvent(eventID,myID); 
     } 
    }); 
} 

function getEvent(eventID,myID){ 

     FB.api("/"+ eventID , function (response3) { 

      if (response3 && !response3.error) { 
       //console.log(response3); 
       var date = new Date((response3.start_time || "").replace(/-/g,"/").replace(/[TZ]/g," ")); 
       var diff = (((new Date()).getTime() - date.getTime())/1000); 
       //console.log(diff); 
       if(myID == response3.owner.id && diff < 0) 
       { 
         //console.log("found= " + myID); 
         var t = getImage(eventID); 
         if(t) 
         { 
          console.log("TRUE"); 
         } 
         else 
         { 
          console.log("false"); 
         } 
       } 

      } 
     }); 
    } 

function getImage(eventID){ 
    //console.log("******eventID== "+eventID); 
    FB.api("/"+eventID+"/picture", 
      { 
       "redirect": false, 
       "type": "normal" 
      },function (response2) { 
       if (response2 && !response2.error) { 
        str="<br/><b>Pic</b> : <img src='"+response2.data.url+"'/>"; 
        //console.log("response2.data.url= "+response2.data.url); 

        //str +="<b>name: </b>"+response3.name+"<br>"; 
        document.getElementById("status2").innerHTML+=str; 
        return true; 
       } 
       else 
       { 
        return false; 
       } 
      }); 
} 

ответ

2

Как вы упомянули вызов API facebook является асинхронным означает, что вы не можете быть уверены, чтобы знать, когда полученные данные будут возвращаться из вашего запроса. Вы можете работать вокруг и гарантировать заказ, который вы ищете, используя функцию обратного вызова:

function readFacebook(id) { 
    console.log("myID= " + id); 
} 

function getMyID(cb) { 
    FB.api('/me', function(response) { 
    console.log("response.id= "+response.id); 
    cb(response.id); 
    }); 
} 

getMyID(readFacebook); 

То, что здесь происходит, что вызов FB.api принимает функцию обратного вызова, который срабатывает, когда ответ приходит от сервера. Поскольку мы поставляем наш собственный callback для getMyID, мы можем использовать это, чтобы получить доступ к response.id после ответа сервера.

+0

Спасибо за ваш ответ. Я должен учиться перезвонить из базового. А если у меня есть 2 или 3 функции внутри? – Bernard

+1

Вы можете, конечно, установить несколько обратных вызовов, но это может стать неразборчивым. Я рекомендую взглянуть на «Обещания» и как они работают. Вот видеоролик для них: [Javascript обещает] (https://www.youtube.com/watch?v=OU7WuVGSuZw) –

+0

вам действительно не нужно вставлять обратные вызовы, вы можете назвать их и использовать имена внутри друг друга, передавая любые соответствующие аргументы при его вызове. в основном, не используют анонов в качестве обратных вызовов и используют аргументы DI-стиля вместо замыканий ... вы также можете использовать обратные вызовы как объекты для хранения дополнительных свойств (вместо глобальных). – dandavis

Смежные вопросы