返回javascript回调(node.js)的结果
Return result from a javascript callback (node.js)
我知道这个问题被问了很多次,但我无法解决。
这是我的情况。我有一个名为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
中的所有URL,对其进行操作并返回结果。
您可以从URI.js文档中查看示例
我想要使用这些URL的是使用nodepasser来取消所有URL的排序。
这来自node-bypasser
文档:
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
的结果
我在tonicdev.com 上创建了一个笔记本
解决方案
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);
});
你并不真正理解回调是什么。回调的作用是允许异步代码在没有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
变量中,因为数据可能尚未提取。
相关文章:
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- 在IntelliJ IDEA中,如何将JS文件从“;查找用法“;使用TypeScript时的结果
- 是否可以将JXBrowser显示的JS确认对话框的结果返回到调用它的JS部分
- Typeahead.js未显示异步结果
- async问题,JS Promise无法返回结果,但可以使用console.log
- Javascript验证(gen_validatorv4.js)-基于复选框结果
- MeteorJS从上一个函数中检索JS中的结果
- Meteor js-控制台显示'未定义'即使返回结果
- 在safari和chrome中,js图像加载产生了奇怪的结果
- 如何使用node.js和express在文件中写入结果
- Three.js CSG如何更改结果's的材质和颜色
- 无法使用streams/highland.js从mongodb的结果中获取数据
- 获取结果未定义(主干.js)
- Moment.js不显示结果
- 在Minitest中,我可以在JS页面上触发并分析结果/响应吗
- Angular JS根据搜索结果和点击事件更新DOM元素
- 使用 js 函数显示 HTML 表单的结果
- 在 sql 中求和 col,在 js 中查看结果
- 为什么这个js代码的RSA加密结果与java的RSA标准代码不同
- 如何在模态助推器中显示计算结果(JS)