2017-02-24 1 views
0

解決または拒否の約束を返す関数(createClient)を持つオブジェクト(SoapClient)があります。約束の成就価値はクライアントです。私はSoapClient.createClientを呼び出して、 'then'メソッドで、ローカルのクライアント変数に充足された約束の値を割り当てようとしていますが、関数を返さない限り動作しません。なぜ誰かが説明できますか?ありがとう。ここに私のコードは次のとおりです。なぜ、thenメソッドで結果を代入する約束を返す関数を返さなければならないのですか?

のSoapClientモジュール:

const soap = require('some soap library').soap; 

module.exports = { 
    createClient: (options) => { 
    const { option1, option2, option3, option4 } = options; 
    return new Promise((resolve, reject) => { 
     if (!option1 || !option2) { 
     reject('some error message'); 
     } 

     soap.createClient(option3, {endpoint: option4}, (err, client) => { 
     if (err) { 
      reject(err); 
     } 

     //some code to set authentication here 

     resolve(client); 
     }) 
    }); 
    } 
};  

いくつかのテストクラス:この場合、

before(() => { 
    let soapClient; 
    const options = { option1: 'something', option2: 'something', option3: 'something', option4: 'something' } 

    return SoapClient.createClient(options) 
    .then((client) => { 
     soapClient = client; 
    }) 
    .catch((err) => { 
     throw new Error(err); 
    }); 
}); 

、のSoapClientが正しくクライアントの成就約束値が割り当てられますが、私はリターンを削除するとされますsoapClientは未定義になります。どうしてこれなの?戻り値なしで正しい値をsoapClientに割り当てる方法はありますか?ありがとう。あなたがPromise値または拒否理由をreturn関数を作成することができます

var SoapClient = { 
    createClient: function() { 
    return Promise.resolve(true) 
    .then(function(x) { 
     return 'client'; 
    }); 
    }, 
    createClient1: function() { 
    return Promise.resolve('client'); 
    } 
} 

SoapClient.createClient() 
    .then(function(client) { 
     alert(client); 
    }); 
SoapClient.createClient1() 
    .then(function(client) { 
     alert(client); 
    }) 
+1

このコードは関数内にありますか?なぜあなたはそこに 'リターン'を持っていますか?また、約束事は*非同期*なので、 'createClient()'が実行され '.then'が呼び出されるまで' soapClient'は*設定されません。 –

+1

は他の場所で問題のようです。このコードは機能ですか?どのようにして変数soapClientをチェックしますか? returnステートメントを使わずに関数を呼び出して定義されていないように見える – Sabik

+0

@Sabik:良い点。 'return'を削除すると、この関数が呼び出されたどこでも' undefined'値が得られます。 –

答えて

0

これは、二つの警告を返します。チェーンで値を取得.then()

let getClient = (options) => { 

    const options = Object.assign({ option1: 'something', option2: 'something' }, options); 

    return SoapClient.createClient(options) 
     .then(client => client) 
     .catch((err) => { 
      throw new Error(err); 
     }); 
} 

let soapClient = getClient(/* {option1:"abc"} */); 

soapClient.then(success, err); 
0

+0

私は 'then'と' catch'がここで何をしようとしているのかを調べようとしています。 – lonesomeday

関連する問題