2012-09-24 5 views
4

자바 스크립트를 사용할 수 있어야합니다 :함수를 배열에 푸시 - 루프 스루 및 스플 라이스?

1 : 동일한 기능의 특정 양 (각각 다른 매개 변수 사용)을 배열로 푸시합니다.

2 : 다음 중 하나 (이 예를 들어 단지 파라미터/숫자의 경계)

(3)에 의해 각각의 기능을 실행하여 각 기능 후 난 어레이에서 해당 기능을 접합 할 수 있어야

4 시간마다 배열 길이를 확인하십시오 - 배열이 다시 비어있게되면 사용자에게 경고를 전합니다

이제 1,2 및 4 번째 작업을 수행 할 수있는 것처럼 보입니다. 그것이 실행 된 후 배열에서 함수를 밖으로 - 아무도 도울 수 있습니까? 나는 결코 한 번에 모든 기능은 지금까지

내 자바 스크립트 코드라고되어있는 '완료'경고를 받고하지하고 기능을 제거 할 수 없습니다 같다 : 이것은 당신이 찾고있는 무엇을해야

// Create empty array 
var array = []; 

// Push functions into array - dynamic amount and could be any amount of functions 
array.push(func(1)); 
array.push(func(2)); 
array.push(func(3)); 

// Call array manager function after pushing array 
arrayManager(); 

// Array manager function to splice and detect when finished 
function arrayManager() { 
    if (array.length < 1) { 
     alert("done"); 
    } 
    else { 
    ////////////////////////////////// 
    // << THIS IS WHERE I DON'T KNOW HOW TO SPLICE THE ITEM FROM THE ARRAY 
    ////////////////////////////////// 
    } 
} 

// Function for array objects - alert passed parameter 
function func(num){ 
    alert(num); 
} 
+0

정확하게 당신이 달성하려고하는 무엇을 :

가 더 직접적으로 귀하의 질문에 대답하기 위해, 당신이 원하는 방식으로 배열을 통해 실행하는 가장 간단한 방법은 다음과 같이인가? 그것을하는 더 솔직한 방법이 있을지도 모른다. – zero

+1

[splice 설명서] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/splice)를 읽으셨습니까? –

+0

또한 "길이"속성은 0이 아닌 1에서 시작합니다. – zero

답변

1

:

var next_func = array.splice(0, 1)[0] 

"splice"는 적어도 두 개의 매개 변수를 취합니다. 첫 번째 매개 변수는 제거를 시작할 인덱스이고 두 번째 매개 변수는 삭제할 항목의 수입니다. 새 배열을 반환하기 때문에 함수를 얻으려면 스플 라이스에서 첫 번째 값을 가져옵니다. 처음 두 매개 변수 다음에 원하는만큼의 값을 추가 할 수도 있습니다. 이것들은 당신이 삭제 한 것 대신 배열에 추가 될 것입니다.

그러나 내가 이런 식으로하고있는 이유에 대해 궁금합니다. 프로그래밍에 익숙하지 않은 경우 비공식적 인 방식으로 무언가를하는 것을 이해할 수 있지만 프로그래밍에 익숙하지 않은 경우 더 나은 방법이 있습니다. 이 작업을 수행. 배열에서 함수를 사용할 때 배열에서 항목을 삭제할 필요가 없습니다. 필자는 배열에서 각 함수를 실행 한 다음 루프를 완료 한 후 "array = []"을 설정하는 것이 더 적합 할 것입니다. 그러나 상황에 따라 이것은 여전히 ​​자신이하고있는 일을하는 가장 좋은 방법 일 수 있습니다. 나는 생각하기에 음식을 줄 것이라고 생각했습니다.

+0

나는 내 방식 중 일부가 이상하게 보일 경우 사과 할 정도로 자바 스크립트 (그리고 일반적으로 코딩)에 익숙하지 않다. 기본적으로 나는 모바일 앱용 티타늄 Appcelerator의 순수 자바 스크립트를 사용하고 있습니다. 앱을 통해 사용자가 그림과 스케치를 그릴 것이며 그림의 끝에서 서버에 모든 생성 된 기념일 로고를 업로드 할 수 있어야합니다. 이 작업을 수행하는 방법에 대한 아이디어는 각 낙서를 배열에 함수로 추가하고 배열이 업로드 될 때까지 루프를 비우고 빈 공간이 계속 될 때까지 반복하는 것이 좋습니다. –

+2

그것의 얼굴에 상당히 합리적으로 들립니다. 그러나 모든 기능을 한 번에 언로드하는 경우에는 실제로 스플 라이스를 할 필요가 없습니다. 이와 같은 경우 splicing과 같은 주요 장점은 다소 임의적 인 방식으로 함수를 실행하는 경우입니다. 한꺼번에 모든 것을 실행할 계획이라면 for 루프를 사용하여 각각을 실행 한 다음 끝내면 어레이를 비어있게 설정합니다. 또한 자바 스크립트를 처음 사용하는 경우 Chris Francis와 연결된 MDN 리소스를 확인하십시오. 자바 스크립트에 대해 배울 수있는 좋은 방법입니다. – Bubbles

1
// Create empty array 
var array = []; 

// Push functions into array - dynamic amount and could be any amount of functions 
array.push(function() { func(1); }); 
//if you call array.push(func(1)) the function is executed immediatly 
//then null is stored in the array 
array.push(function() { func(2); }); 
array.push(function() { func(3); }); 

// Call array manager function after pushing array 
arrayManager(); 

// Array manager function to splice and detect when finished 
function arrayManager() { 
    while (array.length){ 
     var fnc=array.splice(0,1)[0] 
     fnc(); 
    } 
    alert ("done");    
} 

// Function for array objects - alert passed parameter 
function func(num){ 
    alert(num); 
}​ 
1

이것이 필요한가요?

1 : 동일한 함수의 특정 양 (각각 다른 매개 변수 사용)을 배열로 푸시합니다.

function func(num){ 
    alert(num); 
} 

var k = []; 
k.push({f:func, params:[1]}); 
k.push({f:func, params:[2]}); 
k.push({f:func, params:[3]}); 

2 : 난에서 해당 기능을 접합 할 수 있어야 각 기능 후 : 다음

3 (예 파라미터/숫자 단지 경고에 대한) 하나의 각 기능을 실행할 배열

4 : 매번 후에 배열 길이를 확인 - 배열이 비어되면 다시 - 당신이 기능을 밀어되지 않은 모든의 완전한

while (k.length > 0) { 
k[0].f(k[0].params); 
k.shift(); 
} 
alert("done"); 
14

먼저 인 사용자에게 경고 그 순간에 배열로, 대신 func를 실행합니다.푸시를 달성하기 위해 당신의 FUNC은 다음과 같이한다 : 당신의 함수는 동기 있다면 우리는 비동기 기능을 처리하는 경우

// Function for array objects - alert passed parameter 
function func(num){ 
    return function(){ 
    alert(num); 
    } 
} 

지금 당신은 단순히 그 때이 필요 배열

for(var i in arr){ 
    arr[i](); 
} 
console.log('done'); 

반복 수 콜백 :

// Function for array objects - alert passed parameter 
function func(num){ 
    return function(callback){ 
    alert(num); 
    callback(); 
    } 
} 

그런 다음 카운터를 사용하여 병렬로 실행할 수도 있습니다. 당신이하고있는 방식으로 매개 변수로 각 기능을 밀어하려면

function run(){ 
    var fn = arr.shift(); 
    if(!fn){ 
    console.log('Done'); 
    } else { 
    fn(run); 
    } 
} 
run(); 
+0

답장을 보내 주셔서 감사합니다! 물론 비동기 반복은 fn (run())을 호출해야합니다. 그렇지 않으면 첫 번째 "실행"(말장난 의도) 이후에 중지됩니다. 내가 뭔가를 놓친다면 꼭 내가 왜 틀린 지 알려주지. : D – DBrown

+0

Nevermind ... :) – DBrown

0

http://jsfiddle.net/nZ459/1/

, 당신은 같은 기능을 포장해야합니다 :

var count = arr.length; 
for(var i in arr){ 
    arr[i](function(){ 
    if(--count === 0){ 
     console.log('Done'); 
    } 
    }); 
} 

또는 순서

그래서 :

function wrapper(arg){ 
    return function(){ 
     console.log(arg); 
    }; 
} 


var ar = []; 

console.log("pushing functions"); 

ar.push(wrapper(1)); 
ar.push(wrapper(2)); 
ar.push(wrapper('three')); 

console.log("done pushing functions"); 

while (ar.length){ 
    var fn = ar.shift(); 
    console.log("calling ", fn); 
    fn(); 
} 

또는 일반 래퍼를 만들 수 있습니다. 함수 및 인수를 매개 변수로 사용하여 익명 함수를 반환합니다.

while (array.length){ 
    var item = array.shift(); 
    ... 
}