在下面的代码中,您看到我发出了一个 HTTP 请求。我解析响应并取出一个“ token ”(一个字符串)。我想返回该 token ,以便将其值分配给 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 吗?我只是想将“ token ”值分配给变量。
谢谢!
最佳答案
如果您使用 Mikeal 的请求库,.post() 方法(或任何其他方法)不会返回 promise (即使返回,您也无法分配值 这样(而不是 promise )。
因此,您的选择是:
- 将使用“foo”的逻辑移到一个单独的函数中,并通过回调调用它。
- 使用辅助库之一(如 Q)将 .post() 包装在一个 promise 中。
- 找到另一个支持 promises 的 HTTP 库。
(注意:我写了上面的代码,但没有运行它,所以它可能无法按原样运行。但它给了你一个想法)
选项 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
例如,您可以使用 Q-IO作者 Kris Kowal,正是他为 promises 创建了广泛使用的 Q 库。
关于javascript - 从 promise 中返回一个字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23940776/