Я новичок в 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 или 3 функции внутри? – Bernard
Вы можете, конечно, установить несколько обратных вызовов, но это может стать неразборчивым. Я рекомендую взглянуть на «Обещания» и как они работают. Вот видеоролик для них: [Javascript обещает] (https://www.youtube.com/watch?v=OU7WuVGSuZw) –
вам действительно не нужно вставлять обратные вызовы, вы можете назвать их и использовать имена внутри друг друга, передавая любые соответствующие аргументы при его вызове. в основном, не используют анонов в качестве обратных вызовов и используют аргументы DI-стиля вместо замыканий ... вы также можете использовать обратные вызовы как объекты для хранения дополнительных свойств (вместо глобальных). – dandavis