gpt4 book ai didi

jquery - notifyWith 不适用于 $.when

转载 作者:行者123 更新时间:2023-12-01 01:09:13 24 4
gpt4 key购买 nike

我正在学习如何使用 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/

内部.progressthis 设置为 $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 确实可以使您的代码按预期运行。

http://jsfiddle.net/3DDSa/18/

$.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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com