2016-07-18 11 views
0

Ich habe eine Funktion zum Entfernen eines angegebenen Verzeichnisses mit dem cordova-plugin-file Plugin erstellt. Die Funktion selbst funktioniert korrekt und entfernt das Verzeichnis, aber ich versuche, basierend auf dem Ergebnis, ein Erfolgs- oder Fehlerergebnis zurückzugeben und bin völlig festgefahren.Lokale Variable wurde nicht richtig zugewiesen

(function() { 
var app = { 
    ... 

    function removeDirectory(path) { 
     var result = false; 

     window.resolveLocalFileSystemURL(path, function(dir, status) { 
      dir.removeRecursively(function(dir, status) { // Success callback 
       result = true; 
       console.log(result); // true 
      }, function(error) { // Failure callback 
       console.log('Error removing directory: ' + getFileError(error.code)); 
      }); 
      console.log(result); // false 
     }); 

     console.log(result); // false 
     return result; 
    } 
} 
})(); 

resolveLocalFileSystemURL() und removeRecursively() beide keinen Wert zurück.

Egal was ich versuche, result endet immer false. Ich habe sogar versucht, eine globale (außerhalb der IIFE) Variable zu verwenden, aber selbst diese hält ihren Wert nicht korrekt.

Es scheint wie eine Variable Umfang Problem, aber ich weiß nur nicht, wie es zu beheben.

+1

Mögliches Duplikat von [Wie gebe ich die Antwort von einem asynchronen Aufruf zurück?] (Http: // stackoverflow.com/questions/14220321/how-do-i-Return-die-Antwort-von-einem asynchronen Anruf) – Andreas

Antwort

0

window.resolveLocalFileSystemURL ist eine asynchrone Funktion. Das bedeutet, dass der Code nicht auf seine return wartet, bevor er fortfährt.

Das ist im Grunde, wie Ihr Code-Pfad aussieht, wenn removeDirectory aufgerufen wird.

  1. Instanziieren Variable result zu false.
  2. Rufen Sie window.resolveLocalFileSystemURL(...) auf und fügen Sie eine Rückruffunktion für die API ein, die nach Abschluss der Verarbeitung aufgerufen werden soll.
  3. Hinweis: Während dieser Phase wird der Code in die nächste Zeile console.log(result) verschoben. Seit result ist immer noch falsch; Während dieser Zeit wird die Datei gelöscht.
  4. Schließlich Anruf return ohne auf window.resolveLocalFileSystemURL warten, um zurückzukehren.

dies zu beheben - Sie etwas tun sollten, wie ...

See:

(function() { 
    var app = { 
    function removeDirectory(path, done) { 
     var result = false; 

     window.resolveLocalFileSystemURL(path, function(dir, status) { 
      dir.removeRecursively(function(dir, status) { // Success callback 
       result = true; 
       console.log(result); // true 
       return done(null, result); // Success, return. 
      }, function(error) { // Failure callback 
       console.log('Error removing directory: ' + getFileError(error.code)); 
       return done(error, result); // oops failed! 
      }); 
     }); 
    } 
} 
})(); 

Wesentlichen hier, was Sie tun, ist removeDirectory nehmen in einem done Parameter zu machen, die würde eine Rückruffunktion sein. Wenn mit seinem Job fertig ist, könnte es die Rückruffunktion verwenden, um eine Antwort an den ursprünglichen Aufrufer für removeDirectory zurückzugeben.

+1

Der Callback gibt die 'result' Variable zurück. Was repariert das? Wer erhält den Rückgabewert? – Andreas

+0

@Andreas - Danke für den Hinweis darauf. Ich habe die Lösung modifiziert, um einen neuen "done" -Parameter für die Hauptfunktion "removeDirectory" einzufügen, und die 'return'-Anweisungen wurden aktualisiert, um die Callback-Funktion" done "aufzurufen, wenn eine Antwort bereit ist, zurückgeschickt zu werden. –

+0

@Prawny Bitte lassen Sie uns wissen, ob dies Ihr Problem löst. Glücklich zu helfen. –

0

Das A in AJAX steht für asynchron. Das bedeutet, dass das Senden der Anfrage (oder eher das Empfangen der Antwort) aus den einfachen Ausführungsschritten herausgenommen wird. In diesem Beispiel gibt .send sofort zurück und die nächste Anweisung, return result ;, wird ausgeführt, bevor die Funktion, die Sie als Erfolgsrückruf übergeben haben, aufgerufen wurde.

Das bedeutet, dass der von Ihnen definierte Listener bei der Rückkehr noch nicht ausgeführt wurde, was bedeutet, dass der von Ihnen zurückgegebene Wert nicht definiert wurde.

function onComplete(a){ // When the code completes, do this 
    alert(a); 
} 

function getFive(whenDone){ 
    var a; 
    setTimeout(function(){ 
     a=5; 
     whenDone(a); 
    },10); 
} 

document.body.innerHTML = getFive(onComplete); 

// wie die oben genannten Funktionen basierend auf Ihren Code ändern.