2017-07-01 7 views
1

私は完全に私の質問を書いています。nodejs待っていないと約束します

なぜ、次のコードに、x()が最後の行は、コンソールで実行終了console.log('success');

によってコンソールに記録されundefined代わりのsuccessに等しくありません。 .then()コールバックがトリガーされます。

どうすればいいですかx()は最後の行が実行される前に 'success'値を返します。

でもyF()はundefinedと評価されます。しかし、.then()は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

さらに説明してください。要求が完了する前に、requestify.getのthen節のコードが起動されると言っていますか? – user93

+0

すべての操作を実行した後、バックアップされた内部でリクエストを完了していますか? – user93

答えて

0

関数xは値を返しません。この例は役に立ちます:

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

あなたの関数で約束を返す必要があります。機能xは次のように変更することができます:

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'; 
     }); 
} 

今、あなたはthenxを呼び出すことができます。

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

あなたのためではないかもしれませんが、私にとってはconsole.log( "hello ,,, x()。then()は' hello {state: 'pending '} '。ちょうど電球をつけた' requestify() 'を返すことに感謝します – user5903880

0

二つのアプローチ:

1)x()〜私は

前方に変数を渡す、電話しますよ

2)yP()〜約束を消費

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); }); 

デバッガの[::]にリスニング:5858

成功-YP成功(YP):200

y・Pと()を成功(YP):200の

成功-x成功(x)は:200の

ハロー成功(X):200

+0

あなたの' yP'関数で余分な約束事を作る必要はありません。 。 –

関連する問題