【问题标题】:Help passing variables between functions in ajax callbacks帮助在 ajax 回调函数之间传递变量
【发布时间】:2011-05-27 21:24:42
【问题描述】:

好的,我正在构建一个向一个服务器发出 ajax 请求的东西,它确定它需要的 url,然后向另一个地方发出新的 ajax 请求。多亏了 SO =) 的所有帮助,一切都在进行中。但是我又被困住了。我正在努力让变量根据需要返回到不同的函数。第二个(jsonp)请求返回一个 json 函数,如下所示:

jsonResponse(
{"it.exists":"1"},"");

还有我的代码……

var img = "null";
var z = "null";

$(document).ready(function()
{
  $.ajax({
    type: "GET",
    url: "connect.php",
    dataType: "xml",
    success:   function  parseXml(data)
        {
          $(data).find("ITEM").each(function()
            {
            query = $("SKU", this).text();
            query = 'http://domain.com/' + query + '?req=exists,json';
            img = $("SKU", this).text();
            img = '<img src="http://domain.com/' + img + '">';  
            var date =$("LAST_SCAN" , this).text();
                $.ajax({
                    url: query,
                    dataType: 'jsonp'       
                    });
                $("table").append('<tr>'+'<td>' + (date) + '</td>' + '<td>' + (z) + '</td>');
            });
        }
    });
});

// function required to interpret jsonp

function jsonResponse(response){
  var x = response["it.exists"];
  // console.log(x); 
  if (x == 0) {
    console.log("NO"); 
    var z = "NO IMG";
    }
  if (x == 1) {
   console.log(img); 
    //this only returns the first image path from the loop of the parseXml function over and over
    var z = (img);  
  }
    return z;
}

所以我想我的问题是两个部分。一个我如何让 img 变量循环到该 if 语句中,然后一旦工作,我如何返回该 z 变量以在第一个 xml 解析器中使用?

【问题讨论】:

  • 您的代码缩进很差,缺少一些右大括号 (}),并且有多余的分号 (;)。这让你很难理解你的代码和你想要做什么。
  • 好的,我清理了它,希望它不会那么混乱......
  • 必须将 JSONP 回调命名为“jsonResponse”吗?或者您能否在请求中指定回调名称?通常,您会在 JSONP 请求中指定回调名称,但我没有看到您在这里这样做。
  • 是的,我无法控制返回的 json。它被包装在函数 jsonResponse 中,正如我在问题顶部显示的那样。哎呀,它被编辑掉了。我会添加它回来了。我有响应工作..所以它使用从第一个 parseXML 定义的 url 遍历每个请求并返回 1 或 0。然后我可以定义变量并在控制台中查看它们..我只是不知道如何将它们返回到原始函数
  • 我在询问包装服务器返回的 json 的函数的名称。典型的 jsonp 请求 url 看起来像 http://foo.org/request?sku=12345&amp;callback=jsonResponse。您是在告诉我您没有将函数名称“jsonResponse”传递给 url 中的服务器吗?如果没有,那对你来说会更棘手。您必须通过实现一个队列来使您的请求同步,一次处理一个,等待每个请求完成,然后再移动到下一个。

标签: javascript xml json function variables


【解决方案1】:

试试这种同步方法:

var itemQueue = [];

$(document).ready(function ()
{
    $.ajax({
        type: "GET",
        url: "connect.php",
        dataType: "xml",
        success: function parseXml(data)
        {
            itemQueue= $(data).find("ITEM").map(function ()
            {
                return {
                    sku: $("SKU", this).text(),
                    date: $("LAST_SCAN", this).text()
                };
            }).get();
            getNextItem();
        }
    });
});

function getNextItem()
{
    var item = itemQueue[0];
    var query = "http://domain.com/" + item.sku + "?req=exists,json";
    $.ajax({
        url: query,
        dataType: 'jsonp'
    });
}

function jsonResponse(response)
{
    var item = itemQueue.shift();
    if (itemQueue.length)
    {
        getNextItem();
    }
    var x = response["it.exists"];
    var z = x == "0" ? "NO IMG" : "<img src=\"http://domain.com/" + item.sku + "\">";
    $("table").append("<tr><td>" + item.date + "</td><td>" + z + "</td>");
}

【讨论】:

  • 太棒了!非常感谢 =) !
【解决方案2】:

将“日期”存储在全局变量中,并将逻辑将 HTML 元素附加到 jsonResponse 函数中。您无法从 jsonResponse 返回控制流,因为它是异步调用的,但您可以继续从该函数中执行任何您想做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-02
    • 2013-04-09
    • 2013-03-07
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    相关资源
    最近更新 更多