2016-07-07 4 views
0

Ich möchte jedes Element in eine Funktion übergeben, die Zeiten dauern. Aber scheint, dass die JS-Funktion asynchron ist. Wie kann ich die Funktion der Reihe nach aufrufen? (Pass nächste Element funktionieren, nachdem die vorherige getan)Wie ruft man eine JavaScript-Funktion sequentiell in einer for-Schleife auf?

function main() { 
    for (var i = 0; i < n ; i++) { 
     doSomething(myArray[i]); 
    } 
} 

function doSomething(item) { 
    // do something take time 
} 

Meine Lösung ist recusively die Funktion aufrufen. Aber ich möchte wissen, gibt es eine andere Möglichkeit, dieses Problem zu lösen? Vielen Dank.

function main() { 
    doSomething(myArray, 0); 
} 

function doSomething(item, i) { 
    // do something take time 
    doSomething(myArray, i + 1); 
} 
+0

Soweit ich weiß, sind for-Zyklen und Funktionsaufrufe in Javascript synchron, also muss es etwas anderes sein, das die Funktion async macht. Vielleicht ist es etwas in der Funktion selbst. –

+0

Entschuldigung dafür, dass mein Code auf einem node.js-Server ausgeführt wird. Ist die Funktion deshalb asynchron? – Aaron

+1

'myArray.forEach (doSomething)' kommt in den Sinn. – Malk

Antwort

0

, wenn Sie das nächste Element übergeben werden soll funktionieren nach vorheriger getan, können Sie versuchen, Versprechen zu verwenden, wie diese

var Q = require('q'); 
var promise; 
main(); 
function main() { 
    promise = doSomethingPromise(0) 
    for (var i = 1; i < 10 ; i++) { 
     (function (i) { 
      promise = promise.then(function (res) { 
       return doSomethingPromise(res + ' ' + i) 
      }); 
     })(i) 

    } 
} 

function doSomethingPromise (item) { 
    var d = Q.defer(); 
     d.resolve(doSomething(item)); 
    return d.promise; 
} 

function doSomething(item) { 
    // do something take time 
    console.log('doSomething', item); 
    return item; 
} 

es können Sie im Auftrag genannt Schliesser werden.

+0

Hallo Chenkehxx, ich habe deine Antwort versucht. Aber der Eintrag [1] für den Eintrag [item.length-1] hängt in der Zeile Q.defer(). – Aaron

+0

kann ich Ihren gesamten Code sehen? Ich führe meinen Code auch nicht aus. es ist nur Pseudocode. – chenkehxx

+0

HI chenkenhxx, mein Code ist genau wie das, was Sie hier geschrieben haben. – Aaron

Verwandte Themen