Сделать это можно с помощью мета тегов. Сейчас мы разберем разные варианты запрета на кэширование.
Запрет на кэширование браузером и прокси-сервером<meta http-equiv="Cache-Control" content="no-cache">
Запрет кэширования страницы, только браузером<meta http-equiv="Cache-Control" content="private">
Установка кэширования на определенное время, для браузера
С помощью кода ниже, мы можем сообщить браузеру, сколько хранить документ в кэше. После чего, кэш будет обновлен.<meta http-equiv="Cache-Control" content="max-age=3600, must-revalidate">
var all_mail;
mailModel.find().exec((err, docs) =>{
// данный код не будет выполнен сразу, он будет выполнен только через какоето время.
// дело в том, что пока бд сделает выборку и отдаст результат
// может пройти определенное время. Чтобы избежать простоев,
// в данном случае метод exec выполняется асинхронно
// то есть тело данной функции будет вызвано не ранее чем от БД будут получены данные
// а js тем временем продолжит выполнение кода дальше
all_mail = docs;
});
// и придет сюда. но так как docs от БД еще не получен, all_mail все еще равен undefined.
console.log(all_mail); // Ошибка
// добро пожаловать в асинхронность
var all_mail;
mailModel.find().exec((err, docs) =>{
// в all_mail засовываем промис(обещание) того, что в скором времени будет результат
all_mail = new Promise((resolve, reject)=>{
resolve(docs);
});
});
all_mail.then((data)=>{
// когда же результат будет получен, обрабатываем его
console.log(data); // все ок)
});
// создаем массив со значениями
var arr = ['a','a','b','b','c','d','d','e','f'];
// перебираем все значения массива с помощью reduce (позволяет на протяжении всего перебора аккумулировать результат обработки каждого элемента)
arr.reduce(
// методу reduce передается стрелочная функция, которая будет вызвана для каждого элемента массива
// данная функция принимает параметры:
// a - аккумулятор (то что вернула данная функция при ее вызове для предыдущего элемента)
// c - текущий элемент массива
// i - индекс текущего элемента массива
(a,c,i) =>
// тело стрелочной функции (не заключено в фигурные скобки, а значит это выражение которое вернет функция)
(
c == arr[i-1] ? // если текущий элемент равен предыдущему
a[a.length-1]+=c : // то добавить его к последнему элементу
a.push(c) // иначе вставить его в конец аккумулятора
, // читаем про оператор запятая в ответе от @rockon404
a // вернуть аккумулятор
),
[] // говорим методу reduce что аккумулятор у нас массив (первый элемент в качестве а получит []
)
isMapAdded
:)var isMapAdded = false;
$(window).scroll(function () {
var el = $('.map');
if ($(this).scrollTop() > el.offset().top - 800) {
if(isMapAdded) return;
isMapAdded = true;
var script = document.createElement('script');
script.src = "https://api-maps.yandex.ru/services/constructor/1....";
el.append(script);
};
});
reader.onloadend = function() {...}
является асинхронным. Поэтому, в момент вызова console.log()
вне responseArray.map(blob=> {...})
массив finalScreenshotsArray
все еще пуст.let finalScreenshotsArray = [];
responseArray.forEach(blob=> {
let reader = new FileReader();
reader.readAsDataURL(blob);
let promise = new Promise((resolve, reject) => {
reader.onloadend = function() {
resolve(reader.result);
}
});
finalScreenshotsArray.push(promise);
});
Promise.all(finalScreenshotsArray)
.then(results => {
console.log(results);
});
function compoundMatch(words, target) {
let srclist = {};
let list = words.reduce((a,w,i)=>{
if( srclist[w] ) return a;
srclist[w] = { w:w, i:i };
if( target.indexOf(w) !== 0 ) return a;
a[w] = { w:w, i:i };
return a;
},{});
srclist = Object.values(srclist);
list = Object.values(list);
const l = Object.keys(srclist).le
for(var i=0; i<list.length; i++){
const left = list[i];
left.s = target.substring(left.w.length);
for(var j=0; j<srclist.length; j++){
const right = srclist[j];
if( right.w.length === left.s.length && right.w === left.s )
return ( left.i<right.i ? [left.w, right.w, [left.i, right.i]] : [right.w, left.w, [left.i, right.i]] );
}
}
return null;
}
// в любом месте страницы, в теге <script> ... </script> пишите следующее:
window.addEventListener('load', function() {
addScript( "http://you.domain/path/to/script/scriptname.js" );
});
/**
* функция добавляет новый тэг <script> на страницу,
* @param {string} url полные URL добавляемого скрипта
*/
function addScript( url ) {
let head = document.getElementsByTagName( 'head' )[ 0 ];
let script = document.createElement( 'script' );
script.charset="utf-8";
script.type = 'text/javascript';
script.src = url;
head.appendChild( script );
}
def smallest(arr):
smallest = arr[0]
smallest_index = 0
for i in range(1,len(arr)):
if arr[i] < smallest:
smallest = arr[i]
smallest_index = i
return smallest_index
d = [4,15,6,2,7,9,9]
print(smallest(d)) # 3
print(d[smallest(d)]) # 2
Use HTML5 websockets using the Node Streams API.
Usage
This module works in Node or in Browsers that support WebSockets. You can use browserify to package this module for browser use.
[
{
"name": "товар1",
"price": 15000,
"quantity": 7
},
{
"name": "товар2",
"price": 25500,
"quantity": 2
}
]
// формируем данные для отправки
const sendData = {
list: cart
};