Question

J'utilise node-soap pour intégrer une API externe basée sur du savon.Avec cette bibliothèque, un objet client est créé au moment de l'exécution sur la base du WSDL.Par conséquent, l’objet client Soap n’est pas valide au moment du design.Il s'agit d'un problème lors de l'utilisation de la bibliothèque de promesses Q.La bibliothèque Q lie/évalue l'appel de méthode trop tôt, avant qu'il ne soit défini.Voici l'extrait de code pour illustrer.

Voici le code client utilisant une chaîne de promesse :

innotas.login(user,pass)
.then(innotas.getProjects())
.then(function () {
    console.log('finished');
});

Il s'agit de l'extrait de code de service pour login() qui fonctionne correctement.

this.login = function login (user, password) {
    var deferred = q.defer();

    // some stuff here

    return self.createClient()
    .then(function () {
        self.innotasClient.login({ username: self.innotasUser, password: self.innotasPassword }, function(err, res) {
            if (err) {
              console.log('__Error authenticating to service: ', err);
              deferred.reject(err);
            } else {
              self.innotasSessionId = res.return;
              console.log('Authenticated: ', self.innotasSessionId);
              deferred.resolve();
            }
        });
    });
};

C'est le problème.self.innotasClient.findEntity n'existe qu'après CreateClient()

this.getProjects = function getProjects (request) {

    // initiation and configuration stuff here

    // CALL WEB SERVICE
    self.innotasClient.findEntity(req, function findEntityCallback (err, response) {
      if (err) {
        deferred.reject(err);
      } else {
        deferred.resolve(response);
      }
    })

    return deferred.promise;

    // alternate form using ninvoke
    return q.ninvoke(self.innotasClient, 'findEntity', req).then(function (response) {
        // stuff goes here
    }, function (err) {
        // err stuff goes here
    })
}

Voici l'erreur d'exécution :

        self.innotasClient.findEntity(req, function findEntityCallback (err, r
                           ^
TypeError: Cannot call method 'findEntity' of null
    at getProjects (/Users/brad/Workspaces/BFC/InnotasAPI/innotas.js:147:28)
    at Object.<anonymous> (/Users/brad/Workspaces/BFC/InnotasAPI/app.js:13:15)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)

Ce code fonctionne bien avec les rappels.Avez-vous une idée sur la façon de faire fonctionner cela avec la bibliothèque de promesses ?

Était-ce utile?

La solution

La bibliothèque Q lie/évalue l'appel de méthode trop tôt, avant qu'il ne soit défini

Non, vous êtes :

innotas.login(user,pass)
.then(innotas.getProjects())

Ici tu appelles getProject() avant de transmettre ses résultats au then méthode.Cependant, then s'attend à un rappeler fonction, qui sera appelée lorsque la promesse sera résolue.Tu utiliserais

innotas.login(user,pass).then(function(loginresult) {
    innotas.getProjects()
})

Si le client n'existe pas avant le createClient méthode donne, le client doit être le résultat de cette fonction - qu'elle renvoie une promesse au client !

Votre lib devrait alors ressembler à ceci :

this.login = function login (user, password) {
    // some stuff here
    return self.createClient().then(function(client) {
        return Q.ninvoke(client, "login", {
            username: self.innotasUser,
            password: self.innotasPassword
        }).then(function(res) {
            self.innotasSessionId = res.return;
            console.log('Authenticated: ', self.innotasSessionId);
            return client;
        }, function(err) {
            console.log('__Error authenticating to service: ', err);
            throw err;
        });
    });
};
this.getProjects = function getProjects (client) {
    // initiation and configuration stuff here

    // CALL WEB SERVICE
    return q.ninvoke(client, 'findEntity', req).then(function (response) {
        // stuff goes here
    }, function (err) {
        // err stuff goes here
    });
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top