我知道这个问题已被多次询问,但我无法使其发挥作用。
这是我的情况。我有一个名为data
的字符串,我想要取消该字符串中的所有链接。
代码:
var Bypasser = require('node-bypasser');
var URI = require('urijs');
var data = 'multiple urls : http://example.com/foo http://example.com/bar';
var result = URI.withinString(data, function(url) {
var unshortenedUrl = null;
var w = new Bypasser(url);
w.decrypt(function(err, res) {
// How can I return res ?
unshortenedUrl = res;
});
// I know the w.descrypt function is a asynchronous function
// so unshortenedUrl = null
return unshortenedUrl;
});

让我带您完成代码。
URI.withinString
将匹配data
中的所有网址,对其进行操作并返回结果。
您可以查看URI.js docs
中的示例我希望这些网址使用node-passer取消所有这些网址。
这来自node-bypasser
document:
var Bypasser = require('node-bypasser');
var w = new Bypasser('http://example.com/shortlink');
w.decrypt(function(err, result) {
console.log('Decrypted: ' + result);
});
这是我想要multiple urls : http://example.com/foo_processed http://example.com/bar_processed
var getUrlRegEx = new RegExp(
"(^|[ \t\r\n])((ftp|http|https|gopher|mailto|news|nntp|telnet|wais|file|prospero|aim|webcal):(([A-Za-z0-9$_.+!*(),;/?:@&~=-])|%[A-Fa-f0-9]{2}){2,}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*(),;/?:@&~=%-]*))?([A-Za-z0-9$_+!*();/?:~-]))"
, "g"
);
var urls = data.match(getUrlRegEx);
async.forEachLimit(urls, 5, function (url, callback) {
let w = new Bypasser(url);
w.decrypt(function (err, res) {
if (err == null && res != undefined) {
data = data.replace(url, res);
callback();
}
});
}, function(err) {
res.send(data);
});
答案 0 :(得分:0)
你真的不明白回调是什么。回调用于允许异步代码在没有Javascript等待的情况下运行。如果你不那么懒,并在代码中添加了一些调试:
console.log("Started parsing");
var result = URI.withinString(data, function(url) {
console.log("URL parsed (or whatever)");
var unshortenedUrl = null;
var w = new Bypasser(url);
w.decrypt(function(err, res) {
// How can I return res ?
unshortenedUrl = res;
});
// I know the w.descrypt function is a asynchronous function
// so unshortenedUrl = null
return unshortenedUrl;
});
console.log("Call to library over");
您(很可能)会按此顺序查看邮件:
Started parsing
Call to library over
URL parsed (or whatever)
答案:无法保证在分配后执行任何代码之前运行回调。您无法将数据放入result
变量中,因为可能尚未获取数据