在下面的代码中,您看到我发出了HTTP请求。我解析响应并拉出一个“令牌”(一个字符串)。我想返回该标记,以便将其值赋给foo。
foo = request.post(
{
url: 'http://10.211.55.4/api/2.0/auth/signin',
body: reqLogin.toString(),
headers: {'Content-Type': 'text/xml'}
},
function(err, response, body) {
if(err) {
console.log(err);
process.exit(1);
}
else {
parseString(body, function (err, result) {
tokencontainer = (result.tsResponse.credentials[0]);
token = tokencontainer.$.token;
console.log('Logged in, token is ', token);
return token;
});
}
}
);
当我运行此代码时,foo的对象类型是Request。我可以以某种方式将整个请求转换为“字符串”,所以我没有将请求对象分配给foo吗?我只想将“标记”值分配给变量。
谢谢!
答案 0 :(得分:3)
如果您正在使用Mikeal的请求库,.post()方法(或任何其他方法)不会返回一个承诺(即使它确实如此,您也无法分配值这种方式(而非承诺)。
所以,你的选择是:
(注意:我编写了上面的代码,但没有运行它,所以它可能无法正常工作。但它会给你一个想法)
选项1可能如下所示:
var logicUsingFoo = function(foo) {
// do stuff with foo here
};
request.post({...}, function (err, response, body) {
// ...
logicUsingFoo(token);
});
// Here, you can't really use foo, because request.post() has not yet
// finished. In Javascript, there's no way to pause program execution.
// You need to either use callbacks, or promises.
选项2
类似(使用Q library):
var promisePost = function(params) {
var q = Q.defer();
request.post(params, function(err, response, body) {
if (err) {
q.reject(err);
} else {
q.resolve(body);
}
};
return q.promise;
}
然后使用它:
promisePost({url: ..., headers: ...}).then(function (body) {
// Do stuff with body, obtain token etc.
}, function (err) {
// Handle error
});
选项3
例如,您可以使用Kris Kowal的Q-IO,这是为广告创建广泛使用的Q库的人。