Q.ninvoke с библиотекой Node-Soap, оценивающей вызов функции слишком рано

StackOverflow https://stackoverflow.com//questions/22004331

  •  20-12-2019
  •  | 
  •  

Вопрос

Я использую node-soap для интеграции с внешним API на основе мыла.С помощью этой библиотеки клиентский объект создается во время выполнения на основе WSDL.Таким образом, объект мыльного клиента недействителен во время разработки.Это проблема при попытке использовать библиотеку обещаний Q.Библиотека Q привязывает/оценивает вызов метода слишком рано, до того, как он будет определен.Вот фрагмент кода для иллюстрации.

Это клиентский код, использующий цепочку обещаний:

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

Это фрагмент кода службы для входа в систему(), который работает нормально.

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

Это проблема.self.innotasClient.findEntity не существует до тех пор, пока 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
    })
}

Это ошибка времени выполнения:

        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)

Этот код отлично работает с обратными вызовами.Есть идеи, как заставить это работать с библиотекой обещаний?

Это было полезно?

Решение

Библиотека Q слишком рано привязывает/оценивает вызов метода, прежде чем он будет определен.

Нет вы:

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

Вот ты звонишь getProject() прежде чем передать результаты в then метод.Однако, then ожидает перезвонить функция, которая будет вызываться, когда обещание будет решено.Вы бы использовали

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

Если клиент не существует до тех пор, пока createClient метод дает результат, клиент должен быть результат этой функции — пусть она вернет обещание клиенту!

Ваша библиотека должна выглядеть так:

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
    });
};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top