2016-10-25 14 views
0

私はES6モジュールと、コールバックとしてそれらの間の関数を正しく呼び出す方法について質問します。別のモジュールをコールバック関数として呼び出す[ES6]

テイク「page_API.js」、データはコールバック関数が、私はこのrequestExecuteAsyncを処理し、より多くの私の「xml_functions.js」で今すぐ

// Make a call to our server, Once we've recieved data we'll call our callback 

import {requestExecuteAsync} from "../xml_functions"; 

export const getData =() => { 
    requestExecuteAsync('api/getData', "dataRecieved"); 
}; 

export const dataRecieved =() => { 
    alert('Recieved Data'); 
}; 

と呼ばれる受け取っされると、私はdataRecievedを呼び出すしたいと思いますサーバーが応答したら

機能がしかし、今、コールバック関数はそれとして、ウィンドウ内で定義されていないこの

// once data has been retrieved from server 
if (callbackparamsArr.length) { 
    window[callback](res, callbackparamsArr); 
} else { 
    window[callback](res); 
} 

のように働いたので、私は、グローバル名前空間に住むすべての機能で、多くのJSファイルから構成されて動作する以前のコードベースもはやdataRecievedの範囲を持っていません。

私はxml_functions内dataRecieved機能を含む

import { dataRecieved } from "../MyPage/MyPage_API.js"; 

を試してみましたが、その後、ちょうど

[callback](res) 

を呼び出すが、requestExecuteAsyncで定義されているため、「dataRecieved」輸入に異なる文字列を指定した取得しました(EGは "dataRecieved"の代わりに "_Data_Recieved_"と呼ばれます。私は何をすべきかわかりません。

何か助けてくれたら大丈夫ですか。

ありがとうございます。

+2

文字列の代わりに関数自体を渡すのはなぜですか?なぜコールバックの代わりにプロミスを使用しないのですか? –

+0

"*これまで私が扱っていたコードベースは、すべての関数がグローバルな名前空間に存在する多くのJSファイルで構成されていました。私はES6モジュールがあなたに良いアプローチを強いることを嬉しく思います:-) – Bergi

+0

@Bergi Ahaあなたは私に言っている!新しいプロジェクトで従来のXML解析+ネットワークコードの一部をモジュールに書き直す機会がありました。 –

答えて

2

コールするコールバック関数の名前を渡すべきではありません。

import {requestExecuteAsync} from "../xml_functions"; 

export function getData() { 
    requestExecuteAsync('api/getData', dataReceived); 
//          ^^^^^^^^^^^^ 
} 
export function dataReceived() { 
    alert('Recieved Data'); 
} 

export function requestExecuteAsync(path, callback) { 
    … 
    if (typeof callback == "function") callback(res); 
    … 
} 

しかし、あなたはES6を使用していることから、あなたがで周りのコールバック関数を渡す必要がないように約束を見てすることがあります:ちょうど関数自体を渡しますすべて。

+0

それはちょうど私が後になったことです、ありがとう! –

関連する問題