我真的很难使用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时,一切正常,但我认为延迟是更好的解决方案。
提前致谢!
答案 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);
});