2016-08-24 6 views
0

laufen lassen und ich benutze settimeout, um die Funktion auszuführen, alle 10 Sekunden bis, erreicht es 60 Sekunden und beendet, aus irgendeinem Grund geht es nicht durch gesetztes Zeitlimit und beendet nur der Prozess.Zeit einstellen nicht die Funktion in Abhängigkeit von der Zeit

self.startInstatorCheck = function() { 
    self.instatorStarts(true); 
    var MAX_WAIT_TIME_MS = 1 * 60 * 1000; 
    var POST_INTERVAL_MS = 10 * 1000; 
    var timeout = Date.now() + MAX_WAIT_TIME_MS; 

    self.proceedInstantorcheck(POST_INTERVAL_MS, timeout); 
} 

self.proceedInstantorcheck = function(POST_INTERVAL_MS, timeout) { 
    debugger; 
    var date = Date.now(); 
    $.ajax({ 
     type: 'POST', 
     url: BASEURL + 'index.php/moneyexchange/check_instantor_field/' + auth, 
     contentType: 'application/json; charset=utf-8' 
    }) 
    .done(function(userinfo) { 
     if (userinfo.instantor_request > 12) { 
     return self.allInstantorCheckMessages('Instantor data gathered'); 
     } else { 
     if (date < timeout) { 
      /* setTimeout just moves forward and does not repeat*/ 
      setTimeout(self.proceedInstantorcheck(), POST_INTERVAL_MS); 
     } else { 
      self.allInstantorCheckMessages('Please go through instantor to '); 
      self.instatorStarts(true); 
      self.magicInstantorbtn2(true); 
     } 
     } 
    }) 
    .fail(function(jqXHR, textStatus, errorThrown) { 
     self.errorMessage(errorThrown); 
    }) 
    .always(function(data) { 

    }); 
} 

Ich bin mit zwei Funktionen seit dem ersten bekommt man die Daten und die zweiten Wiederholungen ohne jedes Mal neuen Timeout-Wert zu bekommen.

+0

Ich habe bemerkt, dass Sie die gleiche Frage drei Mal jetzt gefragt haben, jedes Mal die vorherige Version zu löschen. Wenn Sie die Details nicht herausfinden können, kommentieren Sie die vorhandenen Antworten. Wenn sich die Frage Ihrer Meinung nach von den vorherigen unterscheidet, sollten Sie die alten Fragen nicht löschen. Sie könnten Menschen mit ähnlichen Problemen helfen und uns helfen, Ihren Fall zu verstehen. Auch, da viele Leute (einschließlich mir) sich die Zeit genommen haben, detaillierte Antworten zu schreiben, ist es unhöflich, einfach alles ohne ein Dankeschön, Upvote oder "Akzeptieren" zu löschen. – user3297291

+0

@ user3297291 Ja, tut mir leid, ich hatte so lange mit dieser Frage zu leiden und bekam keine richtige Antwort, also suchte ich hier und da in den letzten 2 Tagen, so tat das, ja, ich verstehe, ich hätte es nicht tun sollen es. – FaF

Antwort

2

Sie nicht korrekt vorgegangen setTimeout verwenden. Der erste Parameter ist function. Wenn diese Funktion Parameter benötigt, müssen Sie sie mit .bind übergeben oder in eine andere Methode einfügen. Hier ist ein funktionierendes Beispiel (beachte, dass ich den Ajax-Teil verspottet und die Intervall- und Timeout-Zeiten verringert habe).

Hinweise:

  • Press Run Code-Schnipsel es Arbeit zu sehen.
  • Dieser Code schützt Sie nicht davor, mehrere startCheck gleichzeitig auszuführen. Stellen Sie sicher, dass Sie es nur einmal anrufen!
  • der nachgeahmten ajax Code hat eine feste Timeout von 500 ms wird die proceedCheck daher 1500ms all 1000ms (POST_INTERVAL_MS) + 500 ms = genannt. Da wir erneut versuchen nach 6000ms stoppen, erhalten wir 5 Versuche in:
    • 1 Versuchen: 0 ms,
    • Versuchen 2: 500ms,
    • Versuchen 3: 2000ms,
    • Versuchen 4: 3500ms,
    • versuchen 5: 5000ms
    • versuchen 6: 6500ms

// Mock jQuery ajax, do not include 
 
var $ = { 
 
    ajax: function(opts) { 
 
    return { 
 
     done: function(cb) { 
 
     setTimeout(cb.bind(null, { 
 
      "instantor_request": 10 
 
     }), 500); 
 
     } 
 
    }; 
 
    } 
 
}, i = 0; 
 

 
// The logic: 
 
var startCheck = function() { 
 
    var MAX_WAIT_TIME_MS = 1 * 6 * 1000; 
 
    var POST_INTERVAL_MS = 1 * 1000; 
 
    var timeout = Date.now() + MAX_WAIT_TIME_MS; 
 

 
    proceedCheck(POST_INTERVAL_MS, timeout); 
 
}; 
 

 
var proceedCheck = function(interval, limit) { 
 
    console.log("Check " + i++); 
 
    $.ajax({}) 
 
    .done(function(userinfo) { 
 
     if (userinfo.instantor_request > 12) { 
 
     console.log("Valid request"); 
 
     } else { 
 
     if (Date.now() < limit) { 
 
      setTimeout(function() { 
 
      proceedCheck(interval, limit); 
 
      }, interval); 
 
     } else { 
 
      console.log("Request timed out"); 
 
     } 
 
     } 
 
    }) 
 
} 
 

 
startCheck();

+0

Hey! Ich versuche, die Codes zusammen zu setzen, und danke für die Hilfe, aber konnte nicht verstehen, was instantor oder Anfrage: 10 ist? Ich bekomme nicht, wie man die var $ = {} mit meinen Codes setzt, könnten Sie mir helfen? – FaF

+0

Sie müssen das '$ = {}' vollständig entfernen. Ich habe es aufgenommen, weil ich nicht wirklich eine Anfrage mache, sondern das Verhalten nachahmen möchte. – user3297291

+0

yup Ich habe es getan, und nur es funktioniert !!! Danke vielmals!!!!!!!!!!!! Sorry für den Ärger gestern, ich war wirklich frustriert! – FaF

1

setTimeout nimmt einen Zeiger auf eine Funktion, es sollte nicht das Ergebnis des Aufrufs dieser Funktion übergeben werden.

Diese

setTimeout(self.proceedInstantorcheck(), POST_INTERVAL_MS); 

sollte

sein
setTimeout(self.proceedInstantorcheck, POST_INTERVAL_MS); 
+1

Wenn Sie die beiden Parameter bereitstellen möchten, müssen Sie sie in eine (anonyme) Funktion einfügen: 'setTimeout (function() {self.conceainInstantorcheck (POST_INTERVAL_MS, Zeitüberschreitung); }, POST_INTERVAL_MS) ' – user3297291

+0

@Jamiec, ich habe es versucht, es ruft immer noch nicht die proceInstantorcheck, es überspringt es einfach, während debuggin. – FaF

+0

@Farhana warte, erwartest du, wenn du 'setTimeout' drückst, bis die Ausführung gestoppt wurde, bis das ausgeführt wurde? Wenn das so ist, missverstehen Sie was "setTimeout" tut. – Jamiec

Verwandte Themen