Краткий ответ: ваш метод foo()
возвращается немедленно, а вызов $ajax()
выполняется асинхронно после возврата функции . Проблема заключается в том, как и где сохранить результаты, полученные при вызове async, после его возврата.
В этом потоке было задано несколько решений. Возможно, самый простой способ - передать объект методу foo()
и сохранить результаты в члене этого объекта после завершения асинхронного вызова.
function foo(result) {
$.ajax({
url: '...',
success: function(response) {
result.response = response; // Store the async result
}
});
}
var result = { response: null }; // Object to hold the async result
foo(result); // Returns before the async completes
Обратите внимание, что вызов foo()
] все равно не вернут ничего полезного. Однако результат асинхронного вызова теперь будет сохранен в result.response
.
Это из-за реализации qDebug()
.
inline QDebug &operator<<(QChar t) { stream->ts << '\'' << t << '\''; return maybeSpace(); }
inline QDebug &operator<<(const char* t) { stream->ts << QString::fromAscii(t); return maybeSpace(); }
inline QDebug &operator<<(const QString & t) { stream->ts << '\"' << t << '\"'; return maybeSpace(); }
Поэтому
QChar a = 'H';
char b = 'H';
QString c = "Hello";
qDebug()<<a;
qDebug()<<b;
qDebug()<<c;
выводит
'H'
H
"Hello"
Итак, почему Qt делает это? Поскольку qDebug
предназначен для отладки, входы различного типа станут текстовыми потоками через qDebug
.
Например, qDebug
печатает логическое значение в текстовое выражение true
/ false
:
inline QDebug &operator<<(bool t) { stream->ts << (t ? "true" : "false"); return maybeSpace(); }
Он выводит true
или false
на ваш терминал. Поэтому, если у вас есть QString
, который хранит true
, вам нужно указать метку кавычки "
, чтобы указать тип.
Просто добавлено к const char *
qDebug() << (const char *)yourQString.toStdString().c_str();
const char * qPrintable ( const QString & str )
– btse
21 June 2018 в 12:12
Qt 5.4 имеет новую функцию, которая позволяет вам отключить эту функцию. Чтобы указать документацию :
QDebug & amp; QDebug :: noquote ()
Отключает автоматическую вставку кавычек вокруг содержимого QChar, QString и QByteArray и возвращает ссылку на поток.
Эта функция была введена в Qt 5.4.
См. также quote () и maybeQuote ().
blockquote>(Emphasis mine.)
Вот пример того, как вы будете использовать этот feature:
QDebug debug = qDebug(); debug << QString("This string is quoted") << endl; debug.noquote(); debug << QString("This string is not") << endl;
Другой вариант - использовать
QTextStream
сstdout
. Вот пример этого в документации :QTextStream out(stdout); out << "Qt rocks!" << endl;
qDebug().noquote() << QStringRef(back, i, cols);
... Я думаю, что это то же самое, а также попробовал ваш пример, но я продолжаю получать сообщение об ошибке: noquote () не является членом QDebug, спасибо за помощь, но это, вероятно, из-за моего Qt версия. Это версия Linux, и на самом деле это не 5.4, а просто основано на 5.4, может быть, это и есть причина.
– Michael
16 January 2015 в 05:23
QDebug
не будет уничтожен, поэтому вы, возможно, не получите отладочный вывод, пока приложение не будет выключить (в какой момент это технически больше не отлаживает / выводит журнал ...)
– ssc
15 December 2016 в 16:25
Qt 4: Если строка содержит только ASCII, это может помочь в следующем обходном пути:
qDebug() << QString("TEST").toLatin1().data();
.data()
будет отображать содержимое строки в Qt5, как и в Qt4. Я уверен, что он занижен из-за ненужного toLatin1
, но это может быть изменено на toUtf8
и т. Д.
– tresf
10 October 2016 в 23:44
qDebug
просто хочу подчеркнуть разницу в типе, чтобы использовать"
до любезно , напомнит вам тип QString. В конце концов, он предназначен для отладки, а не для печати. – Tay2510 16 January 2015 в 04:33"
. – Tay2510 16 January 2015 в 04:40