2017-02-24 52 views
0

我有一個對象(SoapClient)帶有一個函數(createClient),它返回一個已解決或拒絕的承諾。承諾的履行價值是客戶。我試圖調用SoapClient.createClient並在'then'方法中,將履行的promise值賦給我的本地客戶端變量,但除非我返回該函數,否則它不起作用。有人能解釋爲什麼嗎?謝謝。這裏是我的代碼:爲什麼我必須返回一個函數,返回一個承諾,在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的正確分配的客戶端的履行承諾值,但如果我刪除return ,那麼soapClient變得不確定。爲什麼是這樣?有沒有辦法將soapClient分配給沒有返回的正確值?謝謝。

+1

此代碼是否在函數中?你爲什麼在那裏有「返回」?另外,請記住promises是* asynchronous *,因此只有* createClient()完成並且調用'.then'之後,您的'soapClient'纔會被設置。 –

+1

在其他地方看起來像是問題。這是函數的代碼嗎?你用什麼方式檢查變量soapClient?看起來像你調用沒有返回語句的函數,並得到undefined – Sabik

+0

@Sabik:好點。刪除'return'將意味着這個函數被調用的任何地方都會得到一個'undefined'值。 –

回答

0

這將返回兩個警報:

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

您可以創建returnPromise值或拒絕原因的功能。獲得鏈接價值.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

我正試圖弄清楚'then'和'catch'在這裏嘗試的功能。 – lonesomeday

相關問題