javascript - 用 Promises 返回的数据替换出现的文本

标签 javascript regex node.js promise bluebird

我有这样一篇博文:

var post ="## Cool Post [embed]https://soundcloud.com/wonnemusik/teaser-schotone-dear-thomson-button-remix[/embed]"
+ "Here comes another one  [embed]https://soundcloud.com/straightech-bonn-podcast/straightech-and-friends-7-oscar-ozz[/embed]";

现在对于 [embed]soundcloud-url[/embed] 的每次出现,我都需要调用他们的 API 端点 http://api.soundcloud.com/resolve.json?url =soundcloud-url&client_id=my-id,解析返回的JSON并将[embed]替换为我自己的标记。

我如何通过 Promises 使用它?

var post ="## Cool Post [embed]https://soundcloud.com/wonnemusik/teaser-schotone-dear-thomson-button-remix[/embed]"
+ "Here comes another one  [embed]https://soundcloud.com/straightech-bonn-podcast/straightech-and-friends-7-oscar-ozz[/embed]"
var re = /\[embed\](.*)\[\/embed\]/gm;
var m;

do {
    m = re.exec(post);
    if (m) {
      var apiCallUrl = "http://api.soundcloud.com/resolve.json?url=" + m[1] '&client_id=...'
      request(apiCallUrl).then(function(body) {
        var trackinfo = JSON.parse(body[0].body)
        return trackinfo.title
     }
    }
} while (m);

// have all promises fulfilled and old embed in post-var replaced

最佳答案

我没有具体使用bluebird,但通常有an all method包装了一系列 promise (或将 promise 作为参数)。看一眼 bluebird 的 API 文档就会发现它们确实有一个 all。您可以使用的方法。您需要在 do/while 循环中创建一个 promises 数组,然后在末尾调用 all:

var resultPromises = [];
var m;
do {
    m = re.exec(post);
    if (m) {
        var apiCallUrl = "http://api.soundcloud.com/resolve.json?url=" + m[1] '&client_id=...'
        resultPromises.push(request(apiCallUrl));
    }
} while (m);

// have all promises fulfilled and old embed in post-var replaced
Promise.all(resultPromises).then(function (results) {
    // do stuff.
});

现在,如果您想用 promise 的结果替换原始文本,您还需要将匹配项存储在一个数组中。 thenresults 参数将是一个响应数组,按照它们最初添加到数组中的顺序排列。所以,你可以这样做:

var resultPromises = [];
var matches = [];
var m;
do {
    m = re.exec(post);
    if (m) {
        var apiCallUrl = "http://api.soundcloud.com/resolve.json?url=" + m[1] '&client_id=...'
        resultPromises.push(request(apiCallUrl));
        matches.push(m);
    }
} while (m);

var i = 0;
// have all promises fulfilled and old embed in post-var replaced
Promise.all(resultPromises).then(function (results) {
    // haven't tested this. Will leave as practice for the OP :)
    post = post.replace(matches[i], results[i].body[0].body.title);
    i += 1;
});

关于javascript - 用 Promises 返回的数据替换出现的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29285285/

相关文章:

javascript - Vue组件在html中不可见

node.js - 如何使用node js访问私有(private)谷歌电子表格?

javascript - Visual Studio IDE 无法识别 Javascript 中的 EJS 变量

javascript - 无法确定任何并发

javascript - 如果链接中包含单词 "photo"

java - Struts 2制作动态参数

python - 我如何使用正则表达式来匹配 “the end” 而不允许在那里换行?

python - 如何在 SQLAlchemy 中将多个正则表达式合并为一个?

php - 使用正则表达式查找和替换 SQL 查询

javascript - 如何在 Angular 图表条形图中使用纯色条