$.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
'IT' 카테고리의 다른 글
Oracle SQL 개발자 색상 코딩 (0) | 2023.08.01 |
---|---|
JNI를 통해 Java의 바이트[]를 C의 함수에 전달: jarraybyte 사용 방법 (0) | 2023.08.01 |
Oracle이 DML 문을 수행하는 동안 전체 테이블을 잠글 것인지 아니면 행만 잠글 것인지 여부 (0) | 2023.08.01 |
고유하지 않은 인덱스를 고유한 인덱스로 변경 (0) | 2023.08.01 |
코드를 사용하여 장치 화면 크기 범주(소, 일반, 대, xlarge)를 결정하는 방법은 무엇입니까? (0) | 2023.08.01 |