我有一个NodeJS应用程序,我认为从嵌套的Promise内部返回时遇到问题。
如下所示,getToken
功能正在运行。它调用另一个函数来检索密码。在此之后,它在进行GET调用时使用密码值。
然后我们成功获取令牌,然后将body
打印到控制台。这有效。
但是,我现在面临的挑战是将body
的值作为我的令牌传递给另一种方法以供以后使用。 printBodyValue
当前失败并因“未定义”错误而失败。
如何将值从getToken
深处传递到printBodyValue
getToken: function() {
module.exports.readCredentialPassword()
.then(result => {
var request = require('request-promise');
var passwd = result;
var basicAuthData = "Basic " + (new Buffer("fooUser" + ":" + passwd).toString("base64"));
var options = {
method: "GET",
uri: ("http://localhost:8001/service/verify"),
followRedirects: true,
headers: {
"Authorization": basicAuthData
}
};
return request(options)
.then(function (body) {
console.log("Token value is: ", body);
return body;
})
.catch(function (err) {
console.log("Oops! ", err);
});
});
}
printBodyValue: function() {
module.exports.getToken().then(function(body) {
console.log("Token value from printBodyValue is: \n", body);
});
}
答案 0 :(得分:1)
在getToken
中,不是使用嵌套的promise反模式,而是链接你的promises,并返回最终的promise,这样你就可以使用promise并使用它的已解析值:
(另外,因为您使用的是ES6,所以更喜欢const
而不是var
)
getToken: function() {
return module.exports.readCredentialPassword()
.then(result => {
const request = require('request-promise');
const passwd = result;
const basicAuthData = "Basic " + (new Buffer("fooUser" + ":" + passwd).toString("base64"));
module.exports.log("Sending Request: ", jenkinsCrumbURL);
const options = {
method: "GET",
uri: ("http://localhost:8001/service/verify"),
followRedirects: true,
headers: {
"Authorization": basicAuthData
}
};
return request(options);
})
.then(function(body) {
console.log("Token value is: ", body);
// the return value below
// will be the final result of the resolution of
// `module.exports.readCredentialPassword`, barring errors:
return body;
})
.catch(function(err) {
console.log("Oops! ", err);
});
}
printBodyValue: function() {
module.exports.getToken().then(function(body) {
console.log("Token value from printBodyValue is: \n", body);
});
}