В следующем примере, который я написал, показано, как
Этот рабочий пример является автономным. Он будет определять простой объект запроса, который использует объект window XMLHttpRequest
для совершения вызовов. Он будет определять простую функцию, чтобы дождаться завершения кучи обещаний.
Контекст. В этом примере запрашивается конечная точка Spotify Web API для поиска объектов playlist
для заданного набора строк запроса:
[
"search?type=playlist&q=%22doom%20metal%22",
"search?type=playlist&q=Adele"
]
Для каждого элемента новый Promise запустит блок - ExecutionBlock
, проанализирует результат, заплатит новый набор обещаний на основе массива результатов, который представляет собой список объектов Spotify user
и выполняет новый HTTP-вызов в ExecutionProfileBlock
асинхронно.
Затем вы можете увидеть вложенную структуру Promise, которая позволяет вам генерировать множественные и полностью асинхронные вложенные HTTP-вызовы и присоединять результаты к каждому подмножеству вызовов через Promise.all
.
NOTE Recent Spotify search
API-интерфейсам потребуется указать токен доступа в заголовках запроса:
-H "Authorization: Bearer {your access token}"
Итак, вы должны запустить следующий пример, вам нужно поместить маркер доступа в заголовки запроса:
var spotifyAccessToken = "YourSpotifyAccessToken";
var console = {
log: function(s) {
document.getElementById("console").innerHTML += s + "
"
}
}
// Simple XMLHttpRequest
// based on https://davidwalsh.name/xmlhttprequest
SimpleRequest = {
call: function(what, response) {
var request;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // Internet Explorer
try {
request = new ActiveXObject('Msxml2.XMLHTTP');
}
catch (e) {
try {
request = new ActiveXObject('Microsoft.XMLHTTP');
} catch (e) {}
}
}
// State changes
request.onreadystatechange = function() {
if (request.readyState === 4) { // Done
if (request.status === 200) { // Complete
response(request.responseText)
}
else
response();
}
}
request.open('GET', what, true);
request.setRequestHeader("Authorization", "Bearer " + spotifyAccessToken);
request.send(null);
}
}
//PromiseAll
var promiseAll = function(items, block, done, fail) {
var self = this;
var promises = [],
index = 0;
items.forEach(function(item) {
promises.push(function(item, i) {
return new Promise(function(resolve, reject) {
if (block) {
block.apply(this, [item, index, resolve, reject]);
}
});
}(item, ++index))
});
Promise.all(promises).then(function AcceptHandler(results) {
if (done) done(results);
}, function ErrorHandler(error) {
if (fail) fail(error);
});
}; //promiseAll
// LP: deferred execution block
var ExecutionBlock = function(item, index, resolve, reject) {
var url = "https://api.spotify.com/v1/"
url += item;
console.log( url )
SimpleRequest.call(url, function(result) {
if (result) {
var profileUrls = JSON.parse(result).playlists.items.map(function(item, index) {
return item.owner.href;
})
resolve(profileUrls);
}
else {
reject(new Error("call error"));
}
})
}
arr = [
"search?type=playlist&q=%22doom%20metal%22",
"search?type=playlist&q=Adele"
]
promiseAll(arr, function(item, index, resolve, reject) {
console.log("Making request [" + index + "]")
ExecutionBlock(item, index, resolve, reject);
}, function(results) { // Aggregated results
console.log("All profiles received " + results.length);
//console.log(JSON.stringify(results[0], null, 2));
///// promiseall again
var ExecutionProfileBlock = function(item, index, resolve, reject) {
SimpleRequest.call(item, function(result) {
if (result) {
var obj = JSON.parse(result);
resolve({
name: obj.display_name,
followers: obj.followers.total,
url: obj.href
});
} //result
})
} //ExecutionProfileBlock
promiseAll(results[0], function(item, index, resolve, reject) {
//console.log("Making request [" + index + "] " + item)
ExecutionProfileBlock(item, index, resolve, reject);
}, function(results) { // aggregated results
console.log("All response received " + results.length);
console.log(JSON.stringify(results, null, 2));
}
, function(error) { // Error
console.log(error);
})
/////
},
function(error) { // Error
console.log(error);
});
Я подробно рассмотрел это решение здесь .
Я тоже сталкиваюсь с этой проблемой. К сожалению, использование пешеходного перехода определенно увеличит ваш размер APK. Тем не менее, я нашел способ уменьшить размер apk. Например, вы могли бы использовать перекресток. Это может снизить ваш размер apk примерно на 15 МБ (см. crosswalk lite ). Вы также можете указать, что вы не хотите создавать проекты для двух архитектур (объяснил здесь ).
Я думаю, что проблема, с которой вы сталкиваетесь, связанная с Crosswalk, связана с эмуляцией. Я пробовал эмуляторы как из версий Android Studio, так и из Genymotion. Они оба плохо работали для тестирования гибридных приложений.
. Мой совет - попробовать Chrome Device Inspector вместе с фактическим тестированием устройства. Я не думаю, что кто-то будет утверждать, что это лучший способ обеспечить производительность. AWS Device Farm - это лишь одно из множества предложений, которые будут выплюнуть физические устройства для тестирования. Есть даже службы, которые позволяют вам проводить аутсорсинг на разных устройствах реальными людьми, просто не могу придумать его имя прямо сейчас ...
Моим текущим фаворитом является Кордова Инструменты для Visual Studio Code , но в последнее время это было неудобно для меня.
Тем не менее, я нахожусь на ранних стадиях флота приложений в Кордове и был встревожен накладной Crosswalk. ~20MB
дополнительно к вашим APK, а ~70MB
- к установленному размеру вашего приложения. Это довольно тревожно, учитывая, что приложения, с которыми мы его используем, с ресурсами ресурсов (изображениями и т. Д.) Составляют примерно 1/10 размера этого плагина!
У нас есть одно приложение, которое на самом деле деградировал с помощью Crosswalk. Моя теория заключается в том, что Crosswalk не очень хорошо разбирается в нестандартном HTML-анализе, который является основной функцией, с которой мы имеем XSLT-преобразованный XML, который заканчивается нестандартным HTML. Перемещение происходит очень медленно по сравнению с WebView по умолчанию. Мы делаем много манипуляций с исходными DocumentNode
объектами, так что, возможно, это все. Тем не менее, я так удивлен, что если медленное перемещение / добавление HTML через ванильный JavaScript, что эти другие приложения видят прирост производительности!
Я также узнал вчера, что существует Общий режим с Crosswalk , который позволяет нескольким приложениям использовать Crosswalk для совместного использования одного экземпляра.
Та же проблема здесь. Я думаю, что обещанный размер 20 Мб для сжатого файла apk, вы смотрите на установленный размер на устройстве.
Вы можете проверить сгенерированный размер APK на platforms/android/build/outputs/apk/
или platforms/android/ant-build/