2017-07-01 6 views
1

Ich übersetze meine Frage komplett umkochen noch weiter.nodejs versprechen nur nicht warten

Warum, im folgenden Code, tut x() zu undefined zu, anstatt success der an die Konsole angemeldet ist durch console.log('success');

Die letzte Zeile endet in der Konsole ausgeführt wird; dann wird der Rückruf ausgelöst.

Wie kann ich es so machen x() gibt den "Erfolg" -Wert zurück, bevor die letzte Zeile ausgeführt wird.

Sogar yF() ergibt undefined. Then() ist jedoch echo th y: success.

const promise = require('promise'); 
const requestify = require('requestify'); 


function x() { 
    requestify.get('https://<redacted>/') 
     .then(function (d) { 
      console.log('success', d.code); 
      return 'success'; 
     }) 
     .fail(function (f) { 
      console.log('fail', f.code); 
      return 'fail'; 
     }); 
    ; 
} 


var yF = function() { 
    yP .then(function (th) { console.log("th", th); return th; }) 
     .catch(function (fl) { console.log("fl", fl); return fl; }); 
} 


var yP = new Promise(
    function (resolve, reject) { 
     if (1 == 1) { 
      resolve("y: success"); 
     } else { 
      reject(new Error("y: fail")); 
     } 
    } 
); 




console.log("hello", x()); 
console.log("world", yF()); 
+0

bitte weiter erklären. Wollen Sie sagen, dass der Code in der then-Klausel von requify.get ausgelöst wird, bevor die Anfrage abgeschlossen ist? – user93

+0

Füllen Sie die Anfrage in der Backed innerhalb dann nach allen Operationen – user93

Antwort

0

Die Funktion x gibt keinen Wert zurück. Dieses Beispiel kann helfen:

> function foo() { console.log('hi from foo'); } 
undefined 
> console.log('calling foo', foo()); 
hi from foo 
calling foo undefined 

Sie müssen das Versprechen in Ihrer Funktion zurückgeben. Funktion x könnte wie folgt ändern:

function x() { 
    return requestify.get('https://<redacted>/') 
     .then(function (d) { 
      console.log('success', d.code); 
      return 'success'; 
     }) 
     .fail(function (f) { 
      console.log('fail', f.code); 
      return 'fail'; 
     }); 
} 

Jetzt können Sie x rufen mit then:

x().then(result => assert(result === 'success')); 
+0

Vielleicht nicht für Sie, aber für mich die console.log ("hallo ,,, x(). Then() verrechnet zu" Hallo {state: "ausstehend Danke für die Erinnerung, dass ich das 'requify()' zurückgeben kann, das alleine eine Glühbirne anschaltet – user5903880

0

zwei Ansätze:

1) x() ~ Ich werde nennen, eine variable vorwärts

passieren

2) yP() ~ ein Versprechen verzehren

const promise = require('promise'); 
const requestify = require('requestify'); 

var f = ""; 


function yP() { 
    return new Promise(function (resolve, reject) { 
     requestify.get('https://<redacted>') 
      .then(function (da) { 
       var fpt = "success(yP):" + da.code.toString(); 
       console.log('success-yP', fpt); 
       resolve(fpt); 
      }) 
      .catch(function (ca) { 
       var fpc = "fail(yP):" + ca.code.toString(); 
       console.log('fail-yP', fpc); 
       reject(fpc); 
      }); 
    }); 
} 


function x() { 
    requestify.get('https://<redacted>/') 
     .then(function (da) { 
      f = "success(x):" + da.code.toString(); 
      console.log('success-x', f); 
      consumef(); 
     }) 
     .catch(function (ca) { 
      f = "fail(x):" + ca.code.toString(); 
      console.log('fail-x', ca); 
      consumef(); 
     }); 
    ; 
} 


function consumef() { 
    console.log("hello", f); 

} 



x(); 
yP() 
    .then(function (fyPt) { console.log('yP().then', fyPt); }) 
    .catch(function (fyPc) { console.log('yP().catch', fyPc); }); 

Debugger hört auf [::]: 5858

Erfolg-yP Erfolg (YP): 200

yP() dann Erfolg (YP):. 200

Erfolg -x Erfolg (x): 200

hallo Erfolg (x): 200

+0

Lies meine Antwort nochmal. Du musst das zusätzliche Versprechen nicht in deiner 'yP' Funktion erstellen, sondern gib einfach den Wert zurück . –

Verwandte Themen