IT

$.when.apply($, 일부 어레이)의 역할은 무엇입니까?

itgroup 2023. 8. 1. 20:27
반응형

$.when.apply($, 일부 어레이)의 역할은 무엇입니까?

지연약속에 대해 읽고 있으며 계속해서 이해하고 있습니다.$.when.apply($, someArray)전체 코드 스니펫이 아니라 한 이 정확히 작동한다는 설명을 찾느라 이것이 정확히 무엇을 하는지는 조금 불분명합니다.다음은 몇 가지 맥락입니다.

var data = [1,2,3,4]; // the ids coming back from serviceA
var processItemsDeferred = [];

for(var i = 0; i < data.length; i++){
  processItemsDeferred.push(processItem(data[i]));
}

$.when.apply($, processItemsDeferred).then(everythingDone); 

function processItem(data) {
  var dfd = $.Deferred();
  console.log('called processItem');

  //in the real world, this would probably make an AJAX call.
  setTimeout(function() { dfd.resolve() }, 2000);    

  return dfd.promise();
}

function everythingDone(){
  console.log('processed all items');
}

.apply 변수 배열로 함수를 호출하는 데 사용됩니다.배열의 각 요소를 사용하고 각 요소를 함수에 대한 매개 변수로 사용합니다..apply또한 컨텍스트를 변경할 수 있습니다(this) 함수 내부에 있습니다.

자, 그럼.$.when"이 모든 약속들이 해결되면...어떤 일을 하라."무한(변수) 수의 모수가 필요합니다.

당신의 경우, 당신은 약속의 배열을 가지고 있습니다. 당신은 당신이 얼마나 많은 약속들을 가지고 있습니다.$.when배열 자체 전달 대상$.when매개 변수가 배열이 아닌 약속일 것으로 예상하기 때문에 작동하지 않습니다.

거기서.apply들어옵니다.그것은 어레이를 가져가고, 호출합니다.$.when각 요소를 매개 변수로 사용(그리고 확인)this으로 설정됨jQuery/$), 그러면 모두 작동합니다 :-)

$.when은 임의의 수의 매개 변수를 사용하고 이러한 매개 변수가 모두 해결되면 해결합니다.

anyFunction.apply(이 값, arrayParameters)는 함수를 컨텍스트 설정( 값은 해당 함수 호출 내의 이 됨)으로 호출하고 arrayParameters의 모든 개체를 개별 매개 변수로 전달합니다.

예:

$.when.apply($, [def1, def2])

다음과 같습니까?

$.when(def1, def2)

그러나 호출 방식을 적용하면 알 수 없는 매개 변수 배열을 전달할 수 있습니다. (코드에서 데이터가 서비스에서 가져온다고 하면 $.when을 호출하는 유일한 방법입니다.)

여기, 코드가 완전히 문서화되었습니다.

// 1. Declare an array of 4 elements
var data = [1,2,3,4]; // the ids coming back from serviceA
// 2. Declare an array of Deferred objects
var processItemsDeferred = [];

// 3. For each element of data, create a Deferred push push it to the array
for(var i = 0; i < data.length; i++){
  processItemsDeferred.push(processItem(data[i]));
}

// 4. WHEN ALL Deferred objects in the array are resolved THEN call the function
//    Note : same as $.when(processItemsDeferred[0], processItemsDeferred[1], ...).then(everythingDone);
$.when.apply($, processItemsDeferred).then(everythingDone); 

// 3.1. Function called by the loop to create a Deferred object (data is numeric)
function processItem(data) {
  // 3.1.1. Create the Deferred object and output some debug
  var dfd = $.Deferred();
  console.log('called processItem');

  // 3.1.2. After some timeout, resolve the current Deferred
  //in the real world, this would probably make an AJAX call.
  setTimeout(function() { dfd.resolve() }, 2000);    

  // 3.1.3. Return that Deferred (to be inserted into the array)
  return dfd.promise();
}

// 4.1. Function called when all deferred are resolved
function everythingDone(){
  // 4.1.1. Do some debug trace
  console.log('processed all items');
}

유감스럽게도 저는 당신들의 의견에 동의할 수 없습니다.

$.when.apply($, processItemsDeferred).always(everythingDone);

윌콜everythingDone보류 인 다른 지연이 있더라도 하나의 지연이 거부되는 즉시.

전체 스크립트는 다음과 같습니다(http://jsfiddle.net/) 을 권장).

var data = [1,2,3,4]; // the ids coming back from serviceA
var processItemsDeferred = [];

for(var i = 0; i < data.length; i++){
  processItemsDeferred.push(processItem(data[i]));
}

processItemsDeferred.push($.Deferred().reject());
//processItemsDeferred.push($.Deferred().resolve());

$.when.apply($, processItemsDeferred).always(everythingDone); 

function processItem(data) {
  var dfd = $.Deferred();
  console.log('called processItem');

  //in the real world, this would probably make an AJAX call.
  setTimeout(function() { dfd.resolve(); }, 2000);    

  return dfd.promise();
}

function everythingDone(){
  alert('processed all items');
}

이거 벌레야?저는 위의 신사가 묘사한 것처럼 이것을 사용하고 싶습니다.

누군가는 이것이 유용하다고 생각할 수 있습니다.

$.when.apply($, processItemsDeferred).then(everythingDone).fail(noGood);

모든 작업 완료는 거부 시 호출되지 않습니다.

$.전달된 모든 약속이 해결/해제될 때 콜백을 호출할 수 있는 경우.일반적으로 $.apply를 사용하면 변수 수가 다양할 때 인수 배열을 전달할 수 있으므로 매우 강력합니다..vmx에 대한 자세한 내용은 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply 에서 확인할 수 있습니다.

우아한 솔루션을 제공해 주셔서 감사합니다.

var promise;

for(var i = 0; i < data.length; i++){
  promise = $.when(promise, processItem(data[i]));
}

promise.then(everythingDone);

한가지요점시: 사용단을 할 때resolveWith일부 매개 변수를 가져오려면 초기 약속이 정의되지 않음으로 설정되어 중단됩니다.성공하기 위해 내가 한 일:

// Start with an empty resolved promise - undefined does the same thing!
var promise;

for(var i = 0; i < data.length; i++){
  if(i==0) promise = processItem(data[i]);
  else promise = $.when(promise, processItem(data[i]));
}

promise.then(everythingDone);

언급URL : https://stackoverflow.com/questions/14777031/what-does-when-apply-somearray-do

반응형