2017-02-24 1 views
0

Ich habe ein Objekt (SoapClient) mit einer Funktion (createClient), die eine Zusage zurückgibt, die entweder aufgelöst oder zurückgewiesen wird. Der erfüllte Wert des Versprechens ist ein Kunde. Ich versuche, SoapClient.createClient aufzurufen und in der "then" -Methode den erfüllten Versprechen-Wert meiner lokalen Client-Variable zuzuweisen, aber es funktioniert nicht, wenn ich die Funktion nicht zurückgebe. Kann jemand erklären warum? Vielen Dank. Hier ist mein Code:Warum muss ich eine Funktion zurückgeben, die ein Versprechen zurückgibt, das Ergebnis in der Then-Methode zuzuordnen?

Soapclient-Modul:

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

einige Testklasse:

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

In diesem Fall wird Soapclient korrekt erfüllt Versprechen Wert von Client zugewiesen, aber wenn ich entfernen die Rückkehr Dann wird soapClient undefiniert. Warum ist das? Gibt es eine Möglichkeit, SoapClient den richtigen Wert ohne die Rückkehr zuzuweisen? Vielen Dank.

+1

Ist dieser Code in einer Funktion? Warum hast du dort eine "Rückkehr"? Denken Sie auch daran, dass Versprechen * asynchron * sind, also wird Ihr 'soapClient * * nicht * gesetzt, bis *' createClient() 'fertig ist und' .dann' aufgerufen wird. –

+1

sieht an anderer Stelle wie Problem aus. Ist dieser Funktionscode? Auf welche Weise überprüfen Sie Variable SoapClient? sieht aus wie Sie Funktion ohne return-Anweisung aufrufen und nicht definiert – Sabik

+0

@Sabik: Guter Punkt. Das Entfernen des 'return' würde bedeuten, dass, wo immer diese Funktion aufgerufen wird, ein 'undefinierter' Wert erhalten wird. –

Antwort

0

Dies wird zwei Warnungen zurück:

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

Sie können eine Funktion erstellen, die den Wert Promise oder Ablehnungsgrund return. Holen Wert bei verketteten .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

Ich versuche herauszufinden, welche Funktionalität der 'then' und der' catch' hier versuchen. – lonesomeday

Verwandte Themen