2015-10-20 16 views
5

これはロングショットですが、javascriptやnode.jsにはC++のstd :: bindといったものがあるのでしょうか?ここで私はバインドする必要性を感じた例があります:代わりにdbaccesss.execするコールバックを渡すjavascriptまたはnode.jsにstd :: bindと同等の機能がありますか?

var writeResponse = function(response, result) { 
    response.write(JSON.stringify(result)); 
    response.end(); 
} 


app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, function(result) { 
     res.write(JSON.stringify(result)); 
     res.end(); 
    }); 
}); 

、私は1つのパラメータを取る関数ポインタを渡すしたいと思います。 C++では、私はこれを渡します。これは私が代わりに匿名のコールバックを渡すことができます(私の場合は「結果」)つのパラメータを取る関数、につながる

std::bind(writeResponse, res) 

。 今、エクスプレスアプリのすべてのルートで、無名関数のすべてのコードを複製しています。

+1

[Function.prototype.bind](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind)? – Oka

答えて

4

それは、私が閉鎖でそれを行うには、より傾斜があると思い存在するが:

function writeResponse(res) { 

    return function(result) { 
     res.write(JSON.stringify(result)); 
     res.end(); 
    }; 
} 
// and then... 
dbaccess.exec(query, writeResponse(res)); 
+0

これは素晴らしいです、ありがとう。私はまた、バインドを使用するよりも読みやすくしています。 – cocheci

-1

2つの方法があります。 Callapplyはわずかに異なります。

bindメソッドもありますが、別のことを行います(関数呼び出し時にthisの値を変更します)。

私はあなたがここに必要なものだと思う「関数ポインタ」のようなものがcurryingでありません。

function currier(that, fn) { 
    var args = [].slice.call(arguments, 2); 

    return function() { 
    return fn.apply(that, args); 
    } 
} 
+0

OPはまったく望んでいないようです。そして、あなたはJSで関数を渡すことができ、関数はオブジェクトであり、すべてのオブジェクトは参照によって渡されます。 –

+0

"1つのパラメータを取る関数ポインタを渡す"は、クロージャから関数を生成したいと思うように聞こえます。 –

+0

@LuisSieira JavaScriptで関数を記述するときに使用する適切な用語を理解できていないようです。 – Oka

3

私はあなたが何をしようとして、十分に理解した場合、私が指すべき Function.prototype.bindメソッド。あなたが説明したように動作します:

app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, writeResponse.bind(null, res)); 
}); 
+0

確かにそれは私が探していたものですが、 'null'ではなく' undefined'を渡す必要がありますか? – cocheci

+1

これはルールではなく規約に似ていますが、ヌルオブジェクトを渡している場合は、その引数は「何もない」と言っています。 – Microfed

1

わからない、彼らはまだNodeJSでサポートしている場合、しかし、もしだから、太い矢印の機能を使いやすくすることもできます。

app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, r => writeResponse(res, r)) 
}); 

彼らはまた、必要なときにいいです字句this値を保持します。

それはこのとほぼ同等です:この1つは.exec()によって定義されたthisを持っているものの

app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, function(r) { 
     return writeResponse(res, r); 
    }) 
}); 

+0

確かにこれも動作します、ありがとうございます。 – cocheci

3

STLにあるbindの機能とは少し異なりますが、JavaScriptの関数のプロトタイプの一部である<function>.bindを使用できます。

bind方法は、新規に作成functionオブジェクト(function sがJavaScriptで最初の市民であり、Functionプロトタイプから始めて構築されていることを忘れないでください)Nを受け入れるマイナスM JavaScriptでパラメータ(これはを返します。実際に弱い拘束を受け入れますが、使用する保証はありません)。Nは元の受け入れられたパラメータ数ですが、Mは拘束されたパラメータです。

主な違いは、bindが最初の引数としてもthis基準として新たに作成された関数自体から利用できるようになり範囲オブジェクトを受け取り、あなたが文字通り実行中this基準を変更して注入することができることです。

Herebindのドキュメントがあります。

誰かに述べたように、あなたも、あなたがバインドを使用することができ、ほぼすべてのケースでは、あなたの目標を取得するために閉鎖に頼ることができます。

関連する問題