0

私の小さなプログラムでは、URL の短縮を解除してから、リンクが私のパターンに一致するかどうかを確認します。もしそうなら、私はそれをさらに処理したいと思います。しかし、以前に知られている 3 つのパラメーターも適用する必要があります。

私のコードは、3 つのパラメーターすべてを各関数にドラッグするのが非常にぎこちなく感じます。約束なしでこれを合理化するにはどうすればよいですか?

var request = require("request");

function expandUrl(shortUrl, a,b,c, callback) {
    request( { method: "HEAD", url: shortUrl, followAllRedirects: true },
        function (error, response) {
            callback(response.request.href, a,b,c);
        });
}


function checklink(unshortenedLink, a, b, c){
    matches = unshortenedLink.match(/twitter\.com\/\w+/g);
    if(matches){
        matches.forEach(function(result){
            process_twitter_link(result, a, b, c);
        });
    }
}

function process_twitter_link(link, a, b ,c ){
    console.log(link + " " + a + " " + b + " " + c);
    // std.out: twitter.com/StackJava param_a param_b param_c
}

expandUrl("https://t.co/W0DA8WVpmO", "param_a", "param_b", "param_c", checklink);
4

4 に答える 4

1

繰り返しを少し減らす簡単な方法は、次を使用すること.bind()です。

var request = require("request");

function expandUrl(shortUrl, callback) {
    request({ method: "HEAD", url: shortUrl, followAllRedirects: true },
        function (error, response) {
            callback(response.request.href);
        });
}


function checklink(a, b, c, unshortenedLink){
    matches = unshortenedLink.match(/twitter\.com\/\w+/g);
    if(matches){
        matches.forEach(function(result){
            process_twitter_link(result, a, b, c);
        });
    }
}

function process_twitter_link(link, a, b ,c ){
    console.log(link + " " + a + " " + b + " " + c);
    // std.out: twitter.com/StackJava param_a param_b param_c
}

expandUrl("https://t.co/W0DA8WVpmO", checklink.bind(null, "param_a", "param_b", "param_c"));

ただしchecklink()、a、b、cへのアクセスは必要ないと思いますが、それとprocess_twitter_linkが密結合しているかどうかに依存する可能性があります。そうでない場合は、次の可能性があります。

var request = require("request");

function expandUrl(shortUrl, callback) {
    request({ method: "HEAD", url: shortUrl, followAllRedirects: true },
        function (error, response) {
            callback(response.request.href);
        });
}


function checklink(iterator){
    return function (unshortenedLink) {
        matches = unshortenedLink.match(/twitter\.com\/\w+/g);
        if(matches){
            matches.forEach(iterator);
        }
    }
}

function process_twitter_link(a, b ,c ){
    return function (link) {
        console.log(link + " " + a + " " + b + " " + c);
    };
}

expandUrl("https://t.co/W0DA8WVpmO", checklink(process_twitter_link("param_a", "param_b", "param_c")));

ほら、a、b、c は 1 か所でしか使用されません。

(このコードはテストされていませんが、理論上は機能するはずです)

于 2013-11-06T15:28:25.507 に答える
1

それらをオブジェクトにラップするとどうなりますか?

function expandUrl(shortUrl, context, callback) {
    request( { method: "HEAD", url: shortUrl, followAllRedirects: true },
        function (error, response) {
            callback(response.request.href, context);
        });
}


function checklink(unshortenedLink, context){
    matches = unshortenedLink.match(/twitter\.com\/\w+/g);
    if(matches){
        matches.forEach(function(result){
            process_twitter_link(result, context);
        });
    }
}

function process_twitter_link(link, context ){
    console.log(link + " " + context.a + " " + context.b + " " + context.c);
    // std.out: twitter.com/StackJava param_a param_b param_c
}

expandUrl("https://t.co/W0DA8WVpmO", {a: "param_a", b: "param_b", c: "param_c"}, checklink);
于 2013-11-06T15:18:10.797 に答える
1

問題はコールバックにあり、非同期性が進行しているため、Promises を使用することをお勧めします。

function expandUrl(shortUrl) {
    var deferred = Deferred.create();
    request( { method: "HEAD", url: shortUrl, followAllRedirects: true },
        function (error, response) {
            deferred.resolve(response.request.href,);
        });
    return deferred.promise();
}

expandUrl(shortenedUrl).done(function (resolved_url) {
    checklink(resolved_url, "param_a", "param_b", "param_c");
});

これにより から 3 つのパラメータが削除されますexpandUrlが、オンのままchecklinkです。


Node.js に promises モジュールがあるかどうかはわかりません。requestそれ自体で promise を返す可能性があります。.thena をチェーンして、解決された URL だけを返すことができる場合があります。


約束なし:

function expandUrl(shortUrl, callback) {
    request( { method: "HEAD", url: shortUrl, followAllRedirects: true },
        function (error, response) {
            callback(response.request.href);
        });
}

expandUrl(shortenedUrl, function (resolved_url) {
    checklink(resolved_url, "param_a", "param_b", "param_c");
});
于 2013-11-06T15:18:41.693 に答える
1

bindを使用して、コールバックを部分的に適用できます。

var request = require("request");

function expandUrl(shortUrl, callback) {
    request( { method: "HEAD", url: shortUrl, followAllRedirects: true },
        function (error, response) {
            callback(response.request.href);
        });
}


function checklink(a, b, c, unshortenedLink){
    matches = unshortenedLink.match(/twitter\.com\/\w+/g);
    if(matches){
        matches.forEach(function(result){
            process_twitter_link(result, a, b, c);
        });
    }
}

function process_twitter_link(link, a, b ,c ){
    console.log(link + " " + a + " " + b + " " + c);
    // std.out: twitter.com/StackJava param_a param_b param_c
}

var checklinkWithParams = checklink.bind(null, "param_a", "param_b", "param_c");

expandUrl("https://t.co/W0DA8WVpmO", checklinkWithParams);

注: 部分的に適用された引数が最初に来ます。

于 2013-11-06T15:22:21.633 に答える