返回javascript回调(node.js)的结果

Return result from a javascript callback (node.js)

本文关键字:结果 js node javascript 回调 返回      更新时间:2023-09-26

我知道这个问题被问了很多次,但我无法解决。

这是我的情况。我有一个名为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变量中,因为数据可能尚未提取。