我在Node 5.7中使用node-strava-v3从Strava的API检索JSON集合。实际上很简单,实际上没有问题。
我只是想借此机会尝试ES6生成器。到目前为止,我认为我已经明白了。但是对于这种Node-Strava-V3 API包装器,方法永远不会直接返回值或承诺。仅允许回调。
这使我想到了一个问题:如何将ES6 Generators概念插入游戏中?

采取以下步骤:(这需要您可以在Strava门户上请求的access_token)

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()”方法结束吗?此方法不返回任何值,值,承诺。

感谢您的所有建议

缩略词

最佳答案

您可以使用生成器和类似co的库来执行此操作,但是现在我们有了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进行承诺的库,例如node-promisify

如果我们使用util.promisifyasync函数:

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
    }
})();


如果您要在逻辑中执行其他异步操作,那通常很有意义。

关于javascript - Strava-V3和Javascript es6生成器=不兼容?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35791286/

10-09 17:54