在 jquery 中使用 Deferred/When 来延迟函数的问题
-
21-12-2019 - |
题
我真的很难在 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);
});
. 不隶属于 StackOverflow