2017-05-22 4 views
0

Ich habe zwei einfache Funktionen: Eine Funktion, die eine promiseWie warten Sie auf die Callback-Funktion?

function showBootbox(){ 
    return new Promise(function (resolve, reject) { 
     bootbox.confirm('Are you sure ? ',resolve); 
    }); 
} 

und eine Funktion gibt, die ein callback verwendet.

function getBootboxValue(callback) { 
    showBootbox().then(function (result) { 
     callback(result); 
    }); 
} 

Jetzt ist das Problem, dass ich nicht auf den Rückruf warten kann, um zu beenden.

if(condition){ 
    getBootboxValue(function(result){ 
    if(result){ 
     //code 
    } 
    }); 
} 
console.log('a'); 

console.log(a) wird ausgeführt, bevor ich das Ergebnis des Versprechens bekam. Wie kann ich dies tun, ohne async/await Mechanismus zu verwenden?

Vielen Dank im Voraus!

+0

"Ich kann nicht auf den Rückruf warten, bis Sie fertig sind", aber Sie müssen. Wenn etwas asynchron läuft, "infiziert" es den Rest Ihres Codes. Nichts (nicht einmal async/erwarten, das ist nur ein Zucker, um Versprechen zu halten) könnte asynchrone Code magisch in sync verwandeln. Sie müssen also den Log-Teil in den Callback verschieben oder eine Promise von 'getBootboxValue' zurückgeben. –

+0

Natürlich wird das 'console.log' zuerst ausgeführt, es ist außerhalb des Callbacks. Wenn Sie möchten, dass danach etwas läuft, muss es innerhalb dieses Callbacks sein. – BenShelton

+0

@BenShelton, ich habe meinen Code aktualisiert. Ich habe den Rückruf innerhalb einer Bedingung und dann habe ich viel Code dann –

Antwort

1

Wenn ich nicht falsch war es, Ihre Idee ist sofort, wenn die Bedingung nicht erfüllt ist und am Ende des Rückrufs, wenn die Bedingung erfüllt ist.

Wenn das so ist, könnte eine Option sein, das Versprechen von getBootboxValue(callback) zurückzugeben, wenn die Bedingung erfüllt ist, und ein bereits erfülltes Versprechen, wenn die Bedingung nicht erfüllt ist. Sie würden dann einen Rückruf für dieses Versprechen verwenden, das die enthalten würde.

function showBootbox() { 
 
    return new Promise(function(resolve, reject) { 
 
    console.log('Are you sure ? '); 
 
    resolve(); 
 
    }); 
 
} 
 

 
function getBootboxValue(callback) { 
 
    return showBootbox().then(function(result) { 
 
    callback(result); 
 
    }); 
 
} 
 

 
function test(condition) { 
 
    var cbk = function(result) { 
 
     console.log('Launching callback'); 
 
     if (result) { 
 
     //code 
 
     } 
 
    }, 
 
    aux = condition ? getBootboxValue(cbk) : Promise.resolve(null); 
 

 
    aux.then(function() { 
 
    console.log('a') 
 
    }); 
 
} 
 

 
test(true); 
 
test(false);

Hoffe, es hilft.

1

Ich denke, das ist, was Sie suchen. Wenn Sie eine Asynchron-Funktion bedingt auszuführen und dann einige Code ausführen sonst, dass Code ausgeführt sowieso können Sie den Code in Funktion setzen und es in jeder Situation nennen:

if(condition){ 
    getBootboxValue(function(result){ 
    if(result){ 
     //code 
    } 
    doSomething(); 
    }); 
} else { 
    doSomething(); 
} 
function doSomething() { 
    console.log('a'); 
} 
+0

ich weiß, dass das möglich ist, aber ich möchte die Lösung, ohne die Funktion zweimal aufzurufen. Wie auch immer, +1. –

Verwandte Themen