2017-05-31 4 views
2

ES6Javascript Versprechen erinnern, bis akzeptable Rendite

ich den Aufruf dieser Methode halten wollen, bis es 0 als Ergebnis zurückgibt. Manchmal dauert es 5 Sekunden, um einen Wert zurückzugeben, manchmal dauert es 10 Sekunden. Manchmal gibt es den Wert nicht zurück, aber ich möchte weitermachen, bis es 0 zurückgibt. Es sollte warten, bis die Antwort zurückkommt oder Timeout in 10 Sekunden, um es zurückzurufen.

So habe ich das versucht, aber es funktioniert nicht aus irgendeinem Grund.

function method() { 
     doSomething(from_api).then(function (status) { 
      if(status != "0") { 
       method(); 
      } else { 
       console.log("success"); 
      } 
     }), function (error) { 
      method(); 
     }); 
} 

Was ist der richtige Weg?

+0

Sorry, bearbeiten ich das jetzt. Dies ist ein Aufruf an api. –

+0

Ich denke, du musst ein wenig Kontext hinzufügen - klingt falsch für mich, um eine API zu schlagen, bis sie etwas zurückgibt, was du willst - berührt etwas anderes die API, damit sie das bringt, worauf du wartest? –

+0

Bitte posten Sie die 'getStatus()' Methode auch – VladNeacsu

Antwort

0

Ich vermute, Sie wollen etwas wie eine asynchrone-while-Schleife.

function asynchronous_while(promise_provider, condition) { 
    return promise_provider().then(function (result) { 
     if (condition(result) === true) { 
      return asynchronous_while(promise_provider, condition); 
     } else { 
      return result; 
     } 
    }); 
} 

asynchronous_while(function() { // promise provider 
    return getStatus(from_api); 
}, function (result) {   // condition 
    return result != "0"; 
}).then(function (result) { 
    console.log("success", result); 
    // result should now be "0"; 
}); 

Wie lange es hängt ganz getStatus(from_api) zurückkehrt, wenn 0 in Anspruch nimmt. Das könnte nie sein. Die gleichen Fallstricke eines traditionellen während gelten.

+0

Es dauert einige Zeit, um von der Methode zurückzukehren. Da dies ein Methodenaufruf ist, der etwas im wirklichen Leben tut und es könnte Timeout sein. Ich denke, das kann nicht asynchron gemacht werden. –

+0

Klingt wie Sie Push/Pull-Benachrichtigungen aussehen sollten. – Halcyon

0

Ihr Code funktioniert. Sie hatten gerade eine zusätzliche schließende Klammer. Wechsel:

}), function (error) { 

zu:

}, function (error) {