如何访问分配给变量的`done()`函数的返回值?

时间:2014-01-22 08:34:57

标签: jquery

我正在尝试解决将getJSON()函数返回的值分配给变量的问题, getJSON()完成后的

我认为以下解决了时间问题,但我遇到了另一个问题,即从done()函数返回的值并将其分配给变量。

var fn1 = $.getJSON("/path", function(){
});

var h = fn1.done(function (results) {
console.log(results.a_key);  // this logs the desired value
console.log(jQuery.type(results.a_key)); // this logs 'string'
return results.a_key;
});

alert(h); // alerts [object Object]

如何访问分配给变量的done()函数的返回值?

这不是一个计时问题,而是关于如何访问返回值。

如果以上是错误的方法,有人可以证明他们如何解决问题并将结果分配给函数之外的变量?

2 个答案:

答案 0 :(得分:0)

done返回jQuery Deferred object - 它不是返回值。

  

由于 deferred.done()返回延迟对象,延迟对象的其他方法可以链接到此方法,包括其他.done()方法。

(显示的值为“[object Object]”,因为这是延迟对象的[[ToString]]。)

一旦你开始使用promises(或其他异步回调),你就会卡住这个方法 - 但是没关系,继续!

// A done() call always returns the same deferred object (fn1 in this case)
// so don't `return` from it.
fn1.done(function (results) {
    console.log(results.a_key);  // this logs the desired value
    console.log(jQuery.type(results.a_key)); // this logs 'string'

    // Do stuff with results here INSIDE the callback
    // (Could also attach an additional `done` or use `then` as appropriate)
    alert(results.a_key)    
});

// Code down here is [likely] run before the done callback runs
// as the callback is "asynchronous".

(与then和更复杂的异步执行流一起使用时,Promises / A和jQuery Deferred对象真的很有趣。)

答案 1 :(得分:0)

<强>解决方案

这对我来说是一个解决方案。

而不是这个范例:

  • function_1以异步方式返回结果
  • a = function_1
  • 的结果
  • a此处使用function_2

我切换到:

  • a = function_1
  • function_1完成时
  • b = function_1
  • 的结果
  • b此处使用function_2

因此function_1.done()函数成为function_2的容器。

示例:

// here is the function that you are waiting on results from
var myGetJsonFunction = $.getJSON("/path", function(){
});
// the following is activated once the above function has run
myGetJsonFunction.done(function (results) {
var variableFromResults = results.a_key;
// use variableFromResults in a function here
});

// call the 'container' function here
$(document).on("click",".form_submit", function (e) {
e.preventDefault();
myGetJsonFunction();
});