使用jQuery 3.0.0,给出
$(function() {
var n = 5;
function jQueryWhenApplyResolveRejectWith(n) {
var arr = $.map(Array(5), function(_, i) {
return $.Deferred();
});
var obj = {
"index": null
};
var promises = $.when.apply(null, arr.map(function(promise, i) {
return i < n
? promise.resolveWith(obj, [i])
: promise.rejectWith((obj.index = i, obj)
, [new Error(i + " is not less than " + n)])
}));
function success(...result) {
console.log("resolved, result:", result, "this:", this);
}
function err(error) {
console.log("rejected, error:", error, "this:", this);
}
return promises.then(success, err);
}
jQueryWhenApplyResolveRejectWith(n)
.then($.proxy(jQueryWhenApplyResolveRejectWith, null, --n))
});
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js">
</script>
&#13;
对jQueryWhenApplyResolveRejectWith
的第一次调用应返回.then()
链接到promises
的已解析jQuery承诺值数组,其中this
是obj
的数组对象。
对jQueryWhenApplyResolveRejectWith
的第二次调用应返回Error
,this
设置为单个对象obj
。
success
的预期结果是this
设置为单obj
,因为单个对象已传递给deferred.resolveWith
。
虽然未返回预期结果,但在stacksnippets的javascript
处,可以使用.bind()
或$.proxy()
.then()
链接到{{1}来返回单个对象}}
promises
&#13;
$(function() {
var n = 5;
function jQueryWhenApplyResolveRejectWith(n) {
var arr = $.map(Array(5), function(_, i) {
return $.Deferred();
});
var obj = {
"index": null
};
var promises = $.when.apply(null, arr.map(function(promise, i) {
return i < n
? promise.resolveWith(obj, [i])
: promise.rejectWith((obj.index = i, obj)
, [new Error(i + " is not less than " + n)])
}));
function success(...result) {
console.log("resolved, result:", result, "this:", this);
}
function err(error) {
console.log("rejected, error:", error, "this:", this);
}
return promises.then($.proxy(success, obj), err);
}
jQueryWhenApplyResolveRejectWith(n)
.then($.proxy(jQueryWhenApplyResolveRejectWith, null, --n))
});
&#13;
问题:
为什么<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js">
</script>
从传递给的普通对象转换为数组
this
;而同一个对象传递给.resolveWith()
使用.rejectWith()
模式返回单个对象?
是否使用$.when.apply()
或...的预期行为
$.when.apply()
,或两者都在相同的过程中,.resolveWith()
被设置为
包含原始this
的数组乘以数字
解决了jQuery promise对象?
答案 0 :(得分:0)
为什么使用带有jQuery.when和的.apply()将其转换为数组 jQuery.Deferred.resolveWith?
- 为什么这会从传递给.resolveWith()的普通对象转换为数组;而传递给.rejectWith()的同一对象返回 使用$ .when.apply()模式的单个对象?
- 在同一过程中使用$ .when.apply()或.resolveWith()或两者的预期行为是否设置为数组 包含原始的这个乘以已解析的jQuery的数量 承诺对象?
醇>
每个promise对象都有自己的上下文。在this
函数处以success
返回的数组表示每个已解析的承诺的this
值。由于可以在解析或拒绝的promise之间更改上下文,因此this
不会展平为单个对象,或者返回数组中的单个值,但对于最初传递给{{1}的每个jQuery promise对象都是不同的}。
是的,相信这是预期的行为。请注意$.when.apply()
不是jQuery方法,而是将一组promises传递给$.when.apply()
并在$.when()
检索已解析的promise的数组的方法,或者单个被拒绝的promise(如果有的话)传递数组中的promise将被拒绝。
如果预期结果为.then()
this
,其中已解析的承诺数组为返回值,您可以使用success
或.bind()
设置$.proxy()
在this
功能。
success
return i < n
? promise.resolve(i) // use `.resolve()` instead of `.resolveWith()` here
: promise.rejectWith((obj.index = i, obj)
, [new Error(i + " is not less than " + n)])
无需调整 return promises.then(success.bind(obj), err); // use `.bind()` to set `this`
函数,因为只有单个被拒绝的承诺返回到err
处理程序,其中onRejected
将是单值,而不是数组。