2012-11-06 171 views
0

我有四个函数来处理我的应用程序的某个部分获取照片url。Javascript函数返回undefined

在函数handleGetPhotoResponse中,alert中有我的url,它看起来应该是一切。

问题出在函数handleGetUsersFurKidsResponse。变量“fkimg”未定义。谁能告诉我我错了哪里?

要使用这部分的应用程序,我打电话给“getUsersFurKids”。

function handleGetPhotoResponse(responseText, size) { 
    var photoDetails = JSON.parse(responseText); 
    var thePhoto = photoDetails[size]; 
    alert(thePhoto); 
    return thePhoto; 
} 

function getPhoto(id, size) { 
    var url = "url-removed"+id; 
    var request = new XMLHttpRequest(); 
    //Send the proper header information along with the request 
    request.open("GET", url); 
    request.onload = function() { 
     if (request.status == 200) { 
      return handleGetPhotoResponse(request.responseText, size); 
     } 
    }; 
    request.send(null); 
} 

// function to handle the response of getting a users fur kids 
function handleGetUsersFurKidsResponse(responseText) { 
    var ul = document.getElementById("furKidList"); 
    var furKids = JSON.parse(responseText); 
    for(var i = 0; i<furKids.length; i++){ 
     var li = document.createElement("li"); 
     var fkimg = getPhoto(furKids[i].ui_id, 'small'); 
     li.innerHTML = "<a href=\"\"><img src=\""+fkimg+"\"> "+furKids[i].p_name; 
     ul.appendChild(li); 
    } 
} 

// function to get a users fur kids 
function getUsersFurKids(id) { 
    // api url for getting fur kids 
    var url = "url-removed"+id; 
    var request = new XMLHttpRequest(); 
    //Send the proper header information along with the request 
    request.open("GET", url); 
    request.onload = function() { 
     if (request.status == 200) { 
      handleGetUsersFurKidsResponse(request.responseText); 
     } 
    }; 
    request.send(null); 
} 
+2

那么确定。 'getPhoto()'不返回任何东西。 –

+0

我以为“return handleGetPhotoResponse(request.responseText,size);”会返回价值? –

+0

@ClintChaney:它返回函数'request.onload()'内的值,而不是'getPhoto()'。此外,被调用的函数和响应GET请求的服务器之间存在延迟。 – JCOC611

回答

3
  // receive a callback---v 
function getPhoto(furKid, size, callback) { 
     //   ^---and the current furKid 

     // use the ui_id------------v 
    var url = "url-removed" + furKid.ui_id; 
    var request = new XMLHttpRequest(); 

    request.open("GET", url); 
    request.onload = function() { 
     if (request.status == 200) { 

     // Invoke the callback, and pass it the result of handleGetPhotoResponse 
      callback(handleGetPhotoResponse(request.responseText, size), furKid.p_name); 
        // use the p_name-----------------------------------------^ 
     } 
    }; 
    request.send(null); 
} 

function handleGetUsersFurKidsResponse(responseText) { 
    var ul = document.getElementById("furKidList"); 
    var furKids = JSON.parse(responseText); 
    for(var i = 0; i<furKids.length; i++){ 

      // pass a callback-----------------v 
     getPhoto(furKids[i], 'small', function(fkimg, p_name) { 
      var li = document.createElement("li"); 
      li.innerHTML = "<a href=\"\"><img src=\""+fkimg+"\"> "+ p_name; 
      ul.appendChild(li); 
     }); 
    } 
} 
+0

您传递给g'etPhoto()的回调函数存在问题,因为当回调试图使用它时,'i'的值不会成为你想要的值,因为'for'循环会运行完成。这是使用回调的正确概念,但由于for循环索引,实现有缺陷。 – jfriend00

+0

@ jfriend00:是的,我已经更新,但谢谢。 :) –

+0

...我只注意到我错过了循环中的'li'变量。固定。 –

3

你似乎并不明白,getPhotos是一个异步函数。其中的onload处理程序在getPhoto函数本身返回并完成之后很久才会调用。因此,您无法从onload中检索到的getPhoto中返回值。因为只有当onload处理程序被调用时,您必须将所有需要使用onPhoto的onload响应的代码放入onload处理程序本身内部(因为该数据已知)。

这是异步编程如何在javsacript中工作。

向getPhoto添加一个回调,并从onload处理程序中调用该回调函数,并将它从异步调用中获得的img传递给它。然后,只有那样,你可以使用该img数据。

+0

谢谢,还在学习JavaScript这部分肯定让我感到困惑。可能会采取一些练习来使用和学习! –