我真的很难在 jquery 脚本中使用 Deferred 或 When 。我已经阅读了这里和其他地方(包括 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 时,一切正常,但我认为延迟是更好的解决方案。

提前致谢!

有帮助吗?

解决方案

尝试像这样修复您的代码:

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

这将确保您正在使用的数据实际上是由 datapoints().

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

带有同步函数的 Promise/Deferreds 没有多大用处。

通常的模式是这样的:

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

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

其他提示

尝试此代码:

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         
})
.

并不肯定你的问题是什么,但这个 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);
});
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top