2016-10-25 59 views
0

我有一個關於ES6模塊的問題,以及如何正確調用它們之間的函數作爲回調。調用另一個模塊函數作爲回調[ES6]

採取「page_API.js」,在數據被收到的回調函數是在我的「xml_functions.js」在那裏我處理這個requestExecuteAsync多叫

// 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一旦服務器已經迴應。

以前我用包括了許多JS文件,與生活在全局命名空間中的所有功能工作的代碼庫,因此函數像這樣工作

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

但是現在的回調函數在窗口不確定的,因爲它不再具有dataRecieved的範圍。

我試過包括xml_functions

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

,然後裏面的dataRecieved功能只需要調用

[callback](res) 

但由於「dataRecieved」進口越來越給出的定義requestExecuteAsync不同的字符串(EG將被稱爲「_Data_Recieved_」而不是「dataRecieved」,我不知道該怎麼辦。

任何幫助將不勝感激!

謝謝

+2

爲什麼不只是傳遞函數本身而不是字符串?爲什麼不使用Promises而不是回調? –

+0

「*以前我使用的代碼庫由許多JS文件組成,所有功能都位於全局名稱空間*」 - ouch。我很高興ES6模塊迫使你更好的方法:-) – Bergi

+0

@Bergi阿哈你告訴我!如果有機會在一個新的項目中開始重新編寫一些舊的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

真棒只是我以後,非常感謝! –

相關問題