我使用节点-strava-v3和Node5.7从Strava的API中检索JSON集合。其实很简单,其实没问题。我只想借此机会尝试一下ES6生成器。到目前为止,我想我明白这个概念了。但是对于Node-Strava-V3API包装器,这些方法永远不会直接返回值或承诺。只允许回调。这就引出了一个问题:如何将ES6生成器的概念插入其中?
拿这个:(这需要access_token,您可以在Strava门户上请求)
var strava = require('strava-v3');
var mainActivity = {id: 504641206};
strava.activities.get(mainActivity, function (err, data){
if(err){ console.log("Strava GET issue: ", err);
/// consume the JSON data here...
};
//rest of the code
但是,我可以使用生成器暂停直到这个"strava.activities.get()“方法结束吗?这种方法不返回任何,没有价值,没有承诺。
谢谢你的建议
FJ
发布于 2016-03-04 00:38:05
您可以使用生成器和像co
这样的库来完成这一任务,但是现在我们有了函数 (ES2017,并且可以对过时的环境进行转换)。
切线相关:任何提供回调的API都可以承诺:
const strava = require('strava-v3');
const mainActivity = {id: 504641206};
new Promise((resolve, reject) => {
strava.activities.get(mainActivity, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
}).then(
result => {
//rest of the code
},
error => {
// handle error
}
);
事实上,这种常见的模式是在util.promisify
中编码的。
const strava = require("strava-v3");
const promisify = require("util").promisify;
const stravaActivitiesGet = promisify(strava.activities.get);
const mainActivity = {id: 504641206};
stravaActivitiesGet(mainActivity).then(
result => {
//rest of the code
},
error => {
// handle error
}
);
有多个库承诺一次生成整个API (而不是每个函数),例如node-promisify
。
如果我们使用util.promisify
和async
函数:
const strava = require("strava-v3");
const promisify = require("util").promisify;
const stravaActivitiesGet = promisify(strava.activities.get);
const mainActivity = {id: 504641206};
(async () => {
try {
const data = await stravaActivitiesGet(mainActivity);
//rest of the code
} catch (error) {
// handle error
}
})();
如果您正在执行逻辑中的其他异步操作,这基本上是有意义的。
https://stackoverflow.com/questions/35791286
复制相似问题