【问题标题】:Strava-V3 & Javascript es6 generators = not compatible?Strava-V3 和 Javascript es6 生成器 = 不兼容?
【发布时间】:2016-06-17 21:46:06
【问题描述】:

我在 Node 5.7 中使用 node-strava-v3 从 Strava 的 API 检索 JSON 集合。其实很简单,其实没什么问题。 我只是想借此机会尝试一下 ES6 生成器。到目前为止一切顺利,我想我明白了这个概念。但是在这个 Node-Strava-V3 API 包装器的情况下,这些方法永远不会直接返回值或承诺。只允许回调。 这让我想到了一个问题:如何将 ES6 生成器概念融入其中?

拿着这个:(这需要你可以在 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()”方法结束吗?此方法不返回任何、没有值、没有承诺。

感谢您的所有建议

FJ

【问题讨论】:

    标签: javascript node.js callback ecmascript-6 generator


    【解决方案1】:

    您可以使用生成器和 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
        }
    })();
    

    如果您在逻辑中执行其他异步操作,这主要是有意义的。

    【讨论】:

    • 感谢 T.J.,这让事情变得整洁干净。我也会检查库和下一个 ES 版本。看起来很有希望:)
    猜你喜欢
    • 1970-01-01
    • 2011-05-28
    • 2022-01-15
    • 2015-08-08
    • 1970-01-01
    • 2013-01-26
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多