我有这样一篇博文:
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 的结果替换原始文本,您还需要将匹配项存储在一个数组中。 then
的 results
参数将是一个响应数组,按照它们最初添加到数组中的顺序排列。所以,你可以这样做:
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/