【问题标题】:Synchronous calls in javascript, but not handled synchronous [duplicate]javascript中的同步调用,但未处理同步[重复]
【发布时间】:2014-08-12 03:16:54
【问题描述】:

我在同步调用方面遇到了一些问题, 并且似乎无法准确理解出了什么问题。

在调试代码时,它完美地填满了 songTracks 数组, 直到返回语句,它又是空的。

代码示例:

function getAllSongIds(lijstId){
  var songTracks = [];
  $.ajax({
    url: "http://somehost.com/lists/"+lijstId+"/editions/",   
      dataType: "jsonp",
      async: false,
      success: function(json){

        for (i in json.editions) {
          $.ajax({
            url:"http://somehost.com/lists/"+lijstId+"/editions/"+json.editions[i].id,
            dataType:"jsonp",
            async: false,
            success: function(json2){
              for(j in json2.tracks){
                if(songTracks.indexOf(json2.tracks[j].id) === -1){
                  songTracks.push(json2.tracks[j].id);
                }
              }
            }
          })
        };
      }

    });
  alert(songTracks);
  return songTracks;
};

【问题讨论】:

  • 欢迎来到回调地狱,循环 XHR 调用。我建议你看看 jQuery 的 promise 特性。问题是您的代码不会等待 XHR 返回,而是继续前进,因此您的成功函数会因延迟而出现偏差
  • 甚至没有读到 async:false。我的坏
  • JSONP 无法使用async:false进行同步
  • 没有阅读 JSONP 部分...

标签: javascript jquery ajax synchronous


【解决方案1】:

JSONP 始终是异步的。 async: false 设置被忽略。来自documentation

[...] 如果您需要同步请求,请将此选项设置为 false。跨域请求和dataType: "jsonp"请求不支持同步操作。

为什么?

JSONP 实际上与 Ajax 无关。 jQuery 只是提供了一个函数来处理这两者。 JSONP 只不过是在文档中附加一个<script> 元素。浏览器会异步加载这些脚本。

请参阅How do I return the response from an asynchronous call? 了解可能的(异步)解决方案。

【讨论】:

    猜你喜欢
    • 2013-10-14
    • 2013-04-02
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    相关资源
    最近更新 更多