2016-10-04 2 views
-1
var myVar;  
    myModule.myFunction().then(function(data){ 
     myVar = data;  
    }); 
    console.log(myVar); 

У меня есть модуль с именем myModule, который экспортирует функцию myFunction с некоторым обещанием. Теперь, когда я присваиваю данные myVar и печатаю их, он показывает undefined. Каким будет правильное решение для достижения этого результата?Возвращает данные обратного вызова

+0

Вы объявляете MYVAR как неопределенные. Затем назначьте некоторые данные myVar, но в то же время console.loging myVar. Убедитесь, что журнал консоли будет запущен после myVar = data, поместив console.log в функцию .then сразу после myVar = data ** Также проверьте, чтобы данные не были неопределенными ** –

+1

Возможный дубликат [Как мне вернуть ответ от асинхронного вызова?] (http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call) –

+1

@BenFortune, вы даже прочитали мой вопрос ? Я уже сделал то, что говорит это решение, но после того, как обещание будет возвращено, мой контроль заблокирован в блоке «then». – Krisalay

ответ

1

Возможно, вам придется пересмотреть свою структуру, но для достижения того, о чем вы просите, нужно иметь console.log внутри обещания.

var myVar;  
    myModule.myFunction().then(function(data){ 
     myVar = data; 
     console.log(myVar); 
    }); 
+1

Я должен использовать myVar вне этого контроля. Есть какой-либо способ сделать это? – Krisalay

1

Код, который вы опубликовали, не является синхронным, поэтому он работает правильно.

Это поток вашего кода, чтобы дать вам лучшее представление о том, что на самом деле делает код.

// myVar is declared undefined 
var myVar; 
// you call console.log with undefined 
console.log(myVar); 
// sometime later .then is called 
myModule.myFunction().then(function(data){ 
    // later you set the global variable to the data 
    myVar = data; 
    // at this point you can log the value of myVar 
}); 

С точки зрения возвращения что-то от AJAX позвонить вы не можете сделать это синхронно, но вы можете цепи другой .then после того как она вернулась.

myModule.myFunction().then(function(data){ 
    // do something with the data 
    return data; 
}) 
.then(function(data){ 
    // do something else with the data 
}) 

Вы можете сохранить сцепление then до тех пор, как вы хотите, и есть более полезные методы, которые можно использовать для обработки ошибок, или позвонив по телефону обещание параллельно или синхронно

0

Поскольку then асинхронные, console.log будет до then, поэтому во время журнала это undefined.

Это даст вам результат вы после:

var myVar;  
myModule.myFunction().then(function(data){ 
    myVar = data; 
    console.log(myVar); 
}); 
+0

Downvoters, почему вы отклонили этот ответ и (предположительно) два других ответа? –

+1

Отличный вопрос! Все три правильные! Возвращение назад! – Tom

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