2017-09-05 5 views
-1

Dies ist die Frage:Kann eine JavaScript-Funktion nur im setTimeout-Callback ausgeführt werden?

Definieren Sie eine Funktion mit dem Namen print, die nur die Parameter ausdrucken, die es bekommt.

Aber es wird nichts ausdrucken, wenn es normal heißt.

Nur in einem SetTimeout wird der Rückruf wirksam.

z:

setTimeout(function() { 
    print('123'); //===> 123 
}); 

print('456'); //===> nothing output 

ich eine Lösung, aber ich glaube nicht, es ist ein guter Weg, ich schreibe die setTimeout.

Ich möchte neugierig eine bessere Lösung.

var print = function() { 
    'use strict'; 
    var __origSetTimeout = window.setTimeout; 

    window.setTimeout = function(fn, delay) { 
     var _fn = new Function(`(${fn.toString().replace(/print\(/g, 'print.call(this,')}).call(this);`); 
     return __origSetTimeout.call(window, _fn.bind({ 
      isFromSetTimeout: true 
     }), delay); 
    }; 

    return function print(word) { 
     if (!this || !!this && !this.isFromSetTimeout) return; 
     console.log(word); 
    }; 
}.call(null); 
+3

Nicht möglich. Sie müssten entweder einen Kontext definieren oder verschiedene Parameter übergeben, damit die Funktion weiß, ob sie ausgeben soll oder nicht. – Utkanos

+0

Nein. Vielleicht suchen Sie nach etwas anderem, warum möchten Sie diese Funktionalität? – Jerodev

+0

Speichern Sie die ID des Timeouts und verwenden Sie diese. – Jivings

Antwort

0

Sie Anwendungsbereich dieses Problem zu lösen können, zum Beispiel

function A(){ 
 
    let print = function(str){ 
 
     console.log(str); 
 
    } 
 
    this.setTimeout = function(){ 
 
     setTimeout(function(){ 
 
      print('123'); 
 
     }, 1000); 
 
    } 
 
} 
 

 

 
let a = new A(); 
 
a.setTimeout();

+0

wird es nicht, es ist eine private Funktion – marvel308

0

Sie für einen dieser einen Affen-Patch für eine Verlängerung der print Funktion mit einer zusätzlichen Prüfung nutzen könnte Objekt und eine Eigenschaft zum Drucken.

// simple function with output 
 
function print(s) { 
 
    console.log(s); 
 
} 
 

 
// apply monkey patch 
 
void function() { 
 
    var p = print; 
 
    print = function() { 
 
     if (this && this.timeout) { 
 
      p.apply(this, arguments); 
 
     } 
 
    } 
 
}(); 
 

 
// bind additional information 
 
setTimeout(print.bind({ timeout: true }, '123')); 
 
\t 
 
print('456');

Verwandte Themen