为什么使用.apply()和jQuery.when以及jQuery.Deferred.resolveWith将其转换为数组?

时间:2016-09-17 05:23:07

标签: javascript jquery apply jquery-deferred jquery-3

使用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;
&#13;
&#13;

jQueryWhenApplyResolveRejectWith的第一次调用应返回.then()链接到promises的已解析jQuery承诺值数组,其中thisobj的数组对象。

jQueryWhenApplyResolveRejectWith的第二次调用应返回Errorthis设置为单个对象obj

success的预期结果是this设置为单obj,因为单个对象已传递给deferred.resolveWith

虽然未返回预期结果,但在stacksnippets的javascript处,可以使用.bind()$.proxy() .then()链接到{{1}来返回单个对象}}

&#13;
&#13;
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;
&#13;
&#13;

问题:

  1. 为什么<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js"> </script>从传递给的普通对象转换为数组 this;而同一个对象传递给.resolveWith() 使用.rejectWith()模式返回单个对象?

  2. 是否使用$.when.apply()或...的预期行为 $.when.apply(),或两者都在相同的过程中,.resolveWith()被设置为 包含原始this的数组乘以数字 解决了jQuery promise对象?

1 个答案:

答案 0 :(得分:0)

  

为什么使用带有jQuery.when和的.apply()将其转换为数组   jQuery.Deferred.resolveWith?

     
      
  1. 为什么这会从传递给.resolveWith()的普通对象转换为数组;而传递给.rejectWith()的同一对象返回   使用$ .when.apply()模式的单个对象?
  2.   
  3. 在同一过程中使用$ .when.apply()或.resolveWith()或两者的预期行为是否设置为数组   包含原始的这个乘以已解析的jQuery的数量   承诺对象?
  4.   

每个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将是单值,而不是数组。