문제

Node-SOAP를 사용하여 외부 SOAP 기반 API와 통합합니다.이 라이브러리를 사용하면 WSDL을 기반으로 런타임에 Client 객체가 생성됩니다.따라서 SOAP 클라이언트 객체는 설계 시간에 유효하지 않습니다.이것은 Q Promise Library를 사용하려는 문제입니다.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.FindEclient ()

이후까지는 infindity가 존재하지 않습니다.
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())
.

여기서 결과를 Per getProject() 메소드로 전달하기 전에 then를 호출합니다.그러나 then는 해결 될 경우 약속이 발생할 때 호출 될 콜백 기능을 기대합니다.

를 사용할 것입니다
innotas.login(user,pass).then(function(loginresult) {
    innotas.getProjects()
})
.

createClient 메소드가 출력 할 때까지 클라이언트가 존재하지 않으면 클라이언트는 해당 함수의 결과 이어야합니다. 클라이언트에 대한 약속을 반환합니다!

lib은 다음과 같이 보입니다 :

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