2016-10-25 5 views
0

У меня есть вопрос относительно модулей ES6 и как правильно вызывать функции между ними в качестве обратного вызова.Вызов другой функции модуля как обратного вызова [ES6]

Принять «page_API.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'); 
}; 

Теперь в моих «xml_functions.js», где я с этим справиться requestExecuteAsync и больше, я хотел бы назвать 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"; 

, а затем просто позвонить

[callback](res) 

, но из-за импорта «dataRecieved» получение дали другую строку, как это определено в requestExecuteAsync (EG он будет называться «_Data_Recieved_» вместо «dataRecieved», я не уверен, что делать.

Любая помощь будет очень признательна!

Thanks

+2

Почему бы просто не передать функцию непосредственно вместо строки? И почему бы не использовать обещания вместо обратных вызовов? –

+0

"* Раньше кодовая база, с которой я работала, состояла из многих JS-файлов со всеми функциями, живущими в глобальном пространстве имен *" - ouch. Я рад, что модули 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

Удивительно, что это только то, что я был после, Большое спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^