Strava-V3 & Javascript es6 发电机 = 不兼容?
Strava-V3 & Javascript es6 generators = not compatible?
我正在使用 node-strava-v3 和 Node 5.7 从 Strava 的 API 中检索 JSON 集合。其实很简单,其实没问题。
我只是想借此机会尝试一下 ES6 Generators。到目前为止一切顺利,我想我明白了。但是在这个 Node-Strava-V3 API 包装器的情况下,这些方法从不直接 return 一个值或一个承诺。只允许回调。
这让我想到了一个问题:如何将 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()" 方法结束吗?此方法不 return 任何,没有价值,没有承诺。
感谢您的所有建议
FJ
您可以使用生成器和像 co
, but now we have async
functions 这样的库来做到这一点(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 进行 promise-ify,例如 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
}
})();
如果您在逻辑中执行其他异步操作,那么这很有意义。
我正在使用 node-strava-v3 和 Node 5.7 从 Strava 的 API 中检索 JSON 集合。其实很简单,其实没问题。 我只是想借此机会尝试一下 ES6 Generators。到目前为止一切顺利,我想我明白了。但是在这个 Node-Strava-V3 API 包装器的情况下,这些方法从不直接 return 一个值或一个承诺。只允许回调。 这让我想到了一个问题:如何将 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()" 方法结束吗?此方法不 return 任何,没有价值,没有承诺。
感谢您的所有建议
FJ
您可以使用生成器和像 co
, but now we have async
functions 这样的库来做到这一点(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 进行 promise-ify,例如 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
}
})();
如果您在逻辑中执行其他异步操作,那么这很有意义。