В следующем примере, который я написал, показано, как
Этот рабочий пример является автономным. Он будет определять простой объект запроса, который использует объект 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);
});
Я подробно рассмотрел это решение здесь .
Если у вас есть ошибка примерно так:
Cannot load modules/mod_ssl.so into server: The specified module could not be found.
ПРИМЕЧАНИЕ. Я считаю, что это связано с ошибкой в части apache openssl для wamp 3.0.6. К счастью, в папке php7 эти библиотеки DLL совместимы для apache и php5.
@RiggsFolly: некоторые небольшие ошибки / опечатки / дополнения в вашем учебнике. Ниже используется в сочетании с WAMPServer 2.5 64 бит (Apache 2.4.9 и PHP 5.5.12) в Windows 7 SP1 64 бит:
-httpd-vhosts.conf находится в файле extra / httpd-vhosts.conf
- когда вы пытаетесь отредактировать файл ваших хостов, обязательно отключите любой virusscanner. Некоторые из них блокируют доступ к файлу хостов.
- обязательно откройте текстовый редактор как администратор при редактировании файла хостов или получите ошибку, пытающуюся сохранить.
-don ' t забыть удалить # в начале строки хоста, если есть
, если вы используете WAMPServer 64 бит, обязательно загрузите 64-битную версию OpenSSL
- шаг openssl genrsa -out сайт \ server.key 2048 создает файл server.key, а не файл privkey.pem!
-file \ wamp \ bin \ apache \ apachex.yz \ conf \ httpd-ssl.conf находится в \ wamp \ bin \ apache \ apachex.yz \ conf \ extra \ httpd-ssl.conf (возможно, это зависит от версии WAMPServer)
- Мне пришлось использовать разные порты для http (80-> 8080) и https (443-> 444), поскольку эти порты, где используется, я думаю, Skype. Если вы используете разные порты, обязательно используйте их везде, где вы видите 80 или 443 в этом учебнике
- мне также пришлось включить socache_shmcb_module. «Httpd -t» также упомянул об этом.
Необходимо активировать модуль LoadModule socache_shmcb_module modules / mod_socache_shmcb.so в файле httpd.conf в wampserver 2.5. Если не apache выдает следующее сообщение:
AH00526: Синтаксическая ошибка в строке 75 в C: /wamp/bin/apache/apache2.4.9/conf/extra/httpd-ssl.conf: SSLSessionCache: 'shmcb 'кеш сеанса не поддерживается (известные имена:). Возможно, вам нужно загрузить соответствующий модуль socache (mod_socache_shmcb?).
@RiggsFolly: самоподписанный сертификат с ключом можно легко сгенерировать, например, здесь ... http://www.selfsignedcertificate.com/ , поэтому я мог бы начать учебник с шага 4 ( У меня также был стандарт: 80 виртуальных серверов работает.)
В любом случае некоторые упомянутые вещи уже были включены в настройке по умолчанию WAMP (я думаю, это меняется от версии к версии), но все остальное мне очень помогло. И на самом деле одна вещь отсутствовала ... Мне также пришлось раскомментировать следующую строку в «httpd.conf»
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
Если у вас есть ошибка:
Не удается загрузить модули / mod_ssl.so на сервер: операционная система не может запустить% 1
blockquote>. Затем у вас есть to:
- Установить Win32 OpenSSL здесь http://slproweb.com/products/Win32OpenSSL.html
- Скопировать / вставить libeay32.dll, ssleay32.dll в папку wp php bin (C: \ wamp64 \ bin \ php \ php5.6.19)
- Перезапустить apache
Примечание: Протестировано на сервере Wamp 3