使用延迟/在jquery中延迟函数的问题

时间:2014-07-31 09:01:12

标签: javascript jquery jquery-deferred deferred

我真的很难使用Deferred或When使用我的jquery脚本。我已经浏览过这里和其他地方的许多文章(包括api.jquery.com),我认为我只是有点太初学者无法理解如何使用这些调用。

我正在尝试将一个函数推迟到我的脚本中的前一个函数完成运行。

我有

function datapoints () {
    //My long function here where I define $data
};

其结果是一个名为$ data的数组。我需要将$ data变量定义到我的下一个函数中,所以我想推迟它。

我试图设置这样的延期:

var deferred = $.Deferred();

deferred.resolve(datapoints());

deferred.done(function result (){
    // My function here where I use $data
        }
    );

我真的很感激有关如何清理它的一些指示。我已经尝试重新创建各种示例,但结果每次都是一个控制台错误,说$ data是未定义的。我知道代码有效,因为当我在运行第二个函数之前手动输入几秒钟的setTimeout时,一切正常,但我认为延迟是更好的解决方案。

提前致谢!

3 个答案:

答案 0 :(得分:1)

尝试修复您的代码:

deferred.done(function result (data){
    // Do not use global $data, use local 'data' instead
    }
);

这将确保您使用的数据实际上是datapoints()返回的数据。

您还应该知道,除非datapoints()是异步函数,否则您编写的代码将阻止JS线程(即,如果在浏览器中运行 - 它将阻止UI)。

使用同步函数的Promises / deferred并没有多大用处。

通常的模式是这样的:

function datapoints() {
   var d = $.Deferred()
   asyncCallToCreateDatapoints(function callback(data) {
      d.resolve(data)
   })
   return d;
}

datapoints().done(function result(data) {
   /* do stuff with data */
})

答案 1 :(得分:0)

试试这段代码:

function datapoints () {
    var deferred = $.Deferred();

    /* later, when data is ready, call:

        deffered.resolve(data);
    */

    return deferred.promise();
}


datapoints().then(function () {
    // runs when data is ready         
})

答案 2 :(得分:0)

不完全确定您的问题是什么,但这jsfiddle对我来说很好。

function datapoints () {
    //My long function here where I define $data
    return {"datapoint1": 1, "datapoint2": 2};
};

var deferred = $.Deferred();

deferred.resolve(datapoints());

deferred.done(function result (data){
    // My function here where I use $data
    console.log("data: ", data);
});