Страницы

Поиск по вопросам

пятница, 21 июня 2019 г.

Как вернуть результат из callback в функцию [дубликат]

На данный вопрос уже ответили: Как вернуть значение из события или из функции обратного вызова? Или хотя бы дождаться их окончания 3 ответа Столкнулся с проблемой асинхронного выполнения запросов. Подскажите, как правильно написать код:
// Determine the only image extension on the url function getImgType(objUrl) { var res = null; chrome.downloads.search({url: objUrl}, function(items) { var mime = items[0].mime; if (mime.indexOf('image/') == 0) { res = mime.substring(6); console.log('1- res = ' + res); }; }); console.log('2- res = ' + res); return res; };
Результат работы:
2- res = null 1- res = jpeg
Нужно чтобы getImgType вернула результат только после завершения работы callback в функции function(items)


Ответ

Результат работы правильный, у вас скрипт выполняется в однопоточной среде, поэтому вы сначала увидели результат переменной res равной null, затем сработал асинхронный callback переданный в функцию search и переменной res присвоилось заначение jpeg. Правильно будет передавать callback в функцию getImgType или использовать Promise
function getImgType(objUrl, callback) { chrome.downloads.search({url: objUrl}, function(items) { var mime = items[0].mime; if (mime.indexOf('image/') == 0) { callback(mime.substring(6)); }; }); };
И собственно вызов
getImgType("http://some-url/", function(mimeType){ // какие-то операции с mimeType });
C использованием Promise
function getImgType(objUrl){ return new Promise(function(resolve, reject){ chrome.downloads.search({url: objUrl}, function(items) { var mime = items[0].mime; if (mime.indexOf('image/') == 0) { resolve(mime.substring(6)); } else { reject(new Error("Incorrect mime type") } }); }); }
Вызов функции getImgType будет выглядеть теперь иначе
getImgType("http://some-url/") .then(function(mimeType){ // какие-то операции с mimeType }) .catch(function(err){ // обработка ошибки });

Комментариев нет:

Отправить комментарий