作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习如何使用 jQuery 的 deferred ,我注意到使用 $.when
时出现问题以及.notifyWith
.
我在没有使用 $.when
的情况下制作了一个示例,并且 .notifyWith
工作完美
function a() {
var d = new $.Deferred,
$A = $('#A'),
$P = $('#P').progressbar();
setTimeout(function() {
$A.css('background-color', 'blue');
d.notifyWith($P, [.5]);
}, 2000);
setTimeout(function() {
$A.text('test');
d.notifyWith($P, [1]);
d.resolveWith($P, ['done']);
}, 4000);
return d.promise();
}
$('#G').click(function() {
a().progress(function(x) {
this.progressbar({
value: x * 100
});
}).done(function(x) {
alert(x)
});
});
演示:http://jsfiddle.net/NTICompass/3DDSa/3/
内部.progress
,this
设置为 $P
,因此进度条可以正确移动。
我想将 2 个 setTimeout
操作拆分为单独的函数,因此我这样做了,并使用 $.when
将 promise 合并为一个:
(function() {
var $P = $('#P').progressbar();
window.a = function() {
var d = new $.Deferred,
$A = $('#A');
setTimeout(function() {
$A.css('background-color', 'blue');
d.notifyWith($P, [.5]);
d.resolve('a()');
}, 2000);
return d.promise();
}
window.b = function() {
var d = new $.Deferred,
$A = $('#A');
setTimeout(function() {
$A.text('test');
d.notifyWith($P, [.5]);
d.resolve('b()');
}, 4000);
return d.promise();
}
}())
$('#G').click(function() {
$.when(a(), b()).progress(function(x, y) {
this.progressbar({
value: ((x || 0) + (y || 0)) * 100
});
}).done(function(x, y) {
alert(x + ' ' + y)
});
});
演示:http://jsfiddle.net/NTICompass/3DDSa/16/
出于某种原因,.progress
中的 this
是不是 $P
。相反,它是延迟对象(或 promise 对象,我不太确定)。为什么 this
不等于 $P
?
最佳答案
我不确定是否有理由这样编写,但只需将第 1336 行上的 promise
更改为 this
确实可以使您的代码按预期运行。
$.when = function(firstParam) {
var args = [].slice.call(arguments, 0),
i = 0,
length = args.length,
pValues = new Array(length),
count = length,
pCount = length,
deferred = length <= 1 && firstParam && jQuery.isFunction(firstParam.promise) ? firstParam : jQuery.Deferred(),
promise = deferred.promise();
function resolveFunc(i) {
return function(value) {
args[i] = arguments.length > 1 ? [].slice.call(arguments, 0) : value;
if (!(--count)) {
deferred.resolveWith(deferred, args);
}
};
}
function progressFunc(i) {
return function(value) {
pValues[i] = arguments.length > 1 ? [].slice.call(arguments, 0) : value;
deferred.notifyWith(this, pValues); // this is line 1336
};
}
if (length > 1) {
for (; i < length; i++) {
if (args[i] && args[i].promise && jQuery.isFunction(args[i].promise)) {
args[i].promise().then(resolveFunc(i), deferred.reject, progressFunc(i));
} else {
--count;
}
}
if (!count) {
deferred.resolveWith(deferred, args);
}
} else if (deferred !== firstParam) {
deferred.resolveWith(deferred, length ? [firstParam] : []);
}
return promise;
};
可能值得添加到票证中。
关于jquery - notifyWith 不适用于 $.when,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11907892/
我正在学习如何使用 jQuery 的 deferred ,我注意到使用 $.when 时出现问题以及.notifyWith . 我在没有使用 $.when 的情况下制作了一个示例,并且 .notify
我是一名优秀的程序员,十分优秀!