Q. Node-SOAP 라이브러리가있는 Q.NInvoke 기능 호출이 너무 이르다
문제
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
});
};
. 제휴하지 않습니다 StackOverflow