【发布时间】:2016-09-26 01:59:31
【问题描述】:
跟进Swap order of arguments to "then" with Bluebird / NodeJS Promises(发布的答案有效,但立即发现了一个新问题)
这是我第一次在 NodeJS 中使用 Promise,所以如果某些约定没有得到很好的遵守或代码草率,我深表歉意。我正在尝试聚合来自多个 API 的数据,将其放入数据库中,然后根据数据的相似性和差异计算一些统计数据。作为一个起点,我试图为单个 API 获取一个 API 令牌。
这是我的完整代码:
var Promise = require('bluebird');
var fs = require('fs');
var request = require('request');
Promise.promisifyAll(fs);
Promise.promisifyAll(request);
// tilde-expansion doesn't follow the callback(err, data) convention
var tilde = function(str) {
var _tilde = require('tilde-expansion');
return new Promise(function(resolve, reject) {
try {
_tilde(str, resolve);
} catch(e) {
reject(e);
}
});
}
var getToken = function() {
return request.getAsync(process.env.token_url, {
headers: {
"Content-Type": "applications/x-www-form-urlencoded"
},
form: {
client_id: process.env.client_id,
client_secret: process.env.client_secret,
grant_type: "client_credentials"
}
})
.then(function(resp) { return resp.body; });
}
var tokenFile = tilde(process.env.token_file)
.catch(function(err) {
console.log("Error parsing path to file... can not recover");
});
var token = tokenFile
.then(fs.readFileAsync) //, "utf8")
.then(function(data) {
console.log("Token (from file): " + data);
return data;
})
.then(JSON.parse)
.catch(function(err) {
console.log("Error reading token from file... getting a new one");
return getToken()
.then(function(data) {
console.log("Token (from API): " + data);
return data;
})
.then(JSON.stringify)
.then(fs.writeFileAsync.bind(null, tokenFile.value()));
});
token.then(function(data) {
console.log("Token (from anywhere): " + token.value);
});
此代码当前正在记录:
Token: undefined
如果我回退到 API。假设我正确地完成了我的承诺(.catch() 可以返回一个承诺,对吗?)然后我会假设问题正在发生,因为fs.writeFileAsync 返回 void。
我想在此承诺的末尾附加一个.return(),但我如何才能访问getToken() 的返回值?我尝试了以下方法:
.catch(function(err) {
console.log("Error reading token from file... getting a new one");
var token = "nope";
return getToken()
.then(function(data) {
console.log("Token (from API): " + data);
token = data;
return data;
})
.then(JSON.stringify)
.then(fs.writeFileAsync.bind(null, tokenFile.value()))
.return(token);
});
但是这会记录“不”。
【问题讨论】:
-
什么是
.return()? -
这是一种bluebird便捷方法,
.then(function(value) { return value; });的缩写 -
你不应该承诺
request,而应该使用request-promise。它使用 Bluebird Promise 构建 -
@peteb 虽然我喜欢一个已经为我完成我想要完成的工作的库的想法,但如果更新了
request,那么我需要等待多长时间才能更新到传播到request-promise?我对长依赖链非常警惕 - 我宁愿知道我始终拥有最新和最好的。
标签: javascript node.js promise bluebird