【问题标题】:When should I use $.getJSON.done() instead of $.getJSON()? [duplicate]我什么时候应该使用 $.getJSON.done() 而不是 $.getJSON()? [复制]
【发布时间】:2017-07-06 00:46:02
【问题描述】:

我想知道这两个代码之间是否有任何概念上的区别:

代码1:

$(function(){ 
  var url = "url";
  $.getJSON(url, function(data){
  console.log(data);
  })
});

代码 2:

$(function(){ 
  var url = "url";
  $.getJSON(url).done(function(data){
  console.log(data);
  })
});

在哪种情况下 $.getJson().done() 方法最相关?

【问题讨论】:

  • 因为他们是:api.jquery.com/deferred.done 如果你不需要promise,使用更简单的版本
  • @mplungjan 内联添加的“完成”处理程序本身不是简单/有效地添加到延迟的“承诺”中吗? (在这两种情况下都返回了 deferred。)也就是说,实际有什么区别?
  • @user2864740 几乎没有实际区别。回调参数只是在将 Promise 添加到 jQuery 之前向后兼容。

标签: javascript jquery


【解决方案1】:

第一个使用回调函数作为第二个参数。这允许您在函数完成后执行代码。请注意,您在一个单独的函数中。

Second 也使用回调函数作为 Promise,但它在底层的工作方式有所不同。

// version one
setTimeout(function() {
  doStuff1();
  doStuff2();
}, 1000)


// version one - callback
function doStuff1() {
  doSomething1("value", function(responce) {
    console.log(responce);
  });
};

function doSomething1(v, cb) {
  if (typeof v === "string") {
    cb(true);
  } else {
    cb(false);
  }
  return false;
}

// note the function will always return false but the callback gets the value you want



// version 2, class with promise callback
// look at the class function and see how it works slightly differently
function doStuff2() {
  var $ = new doSomething2();
  $.Something("value").done(function(resp) {
    console.log(resp)
  });
};

class doSomething2 {
  constructor() {
    this.v = false;
  }

  Something(val) {
    if (typeof val === "string") {
      this.v = true;
    } else {
      this.v = false;
    }
    return this;
  }
  done(cb) {
    return cb(this.v);
  }
}

【讨论】:

  • 你能举一个例子说明必须使用一个而不是另一个的情况吗?
  • 嗯,版本 2 的酷之处在于能够在变量中使用它。您可以将$.Something("string") 设置为变量。 let task1 = $.Something("string"); 然后您可以继续在您的应用程序中做一些事情,并在您准备好时调用task1.done(fn);
  • 我明白了。非常感谢您的快速回复。
猜你喜欢
  • 2016-07-31
  • 1970-01-01
  • 2014-10-06
  • 2016-08-09
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
相关资源
最近更新 更多