добавить задержку (синхронно) работы с современными браузерами кроме IE - PullRequest
0 голосов
/ 12 марта 2019

Рабочий код: в Chrome, Firefox

let sleep = function (ms) {
   return new Promise(resolve => setTimeout(resolve, ms))
};

И где-то в моей функции я использую асинхронное ожидание, чтобы сделать задержку синхронной

function updateHandler(newTags, tagName, contentIds) {
    let deferred = Q.defer(),
        counter = 0,
        failedIDS = [],
        data = {};
    data["contentIds"] = contentIds;
    data["failedIDS"] = failedIDS;
    if (contentIds.length === 0) {
        return Promise.resolve(data);
    }
     //aync and await is here
    _.forEach(contentIds, async function (contentId) {
        //wait for some time and continue
        await sleep(150);

        let tags = [], activity;

        //API hits..
        osapi.jive.core.get({
            v: "v3",
            href: "/contents/" + contentId + ""
        }).execute(function (content) {
            tags = content.tags;
            activity = content["updated"];
            content["tags"] = _.union(tags, newTags);
            osapi.jive.core.put({
                v: "v3",
                href: "/contents/" + contentId + "",
                body: content,
                "minor": "true",
                "updated": activity
            }).execute(function (response) {
                    counter++;
                    if (response.error) {
                        failedIDS.push(contentId);
                    }
                    if (counter === contentIds.length) {
                        deferred.resolve(data);
                    }
                }, function (error) {
                    counter++;
                    failedIDS.push(contentId);
                    if (counter === contentIds.length) {
                        deferred.resolve(data);
                    }
                }
            );
        })
    });
    return deferred.promise;
};

Так что 0,15 секунды должно быть дляЭтот API работает и обновляет все элементы.

Поскольку асинхронное и ожидание не работает в IE, я хотел написать базовую функцию wait(ms), которая ожидает 0,15 секунды.

Примечание : Таким образом, без функции sleep() вышеприведенный цикл прекрасно работает для первой итерации, завершается неудачей для второй итерации и завершает выполнение кода.ТАК обязательно требуется задержка в 0,15 секунды для каждой итерации, это ограничение продукта.

setTimeout() является асинхронным ... поэтому я не использовал его.

Ниже код работает для меня.. Но это не то, что я хочу, потому что браузеру не хватает памяти и больше загрузки процессора, дорого ..

function wait(ms) {
  console.log("started............");
    var start = Date.now(),
        now = start;
    while (now - start < ms) {
      now = Date.now();
    }
  console.log("finished............");
}

Вопрос: Я хочукак минимум задержка 0,15 секунды для каждой итерации, как мне ее достичь.

++ Я попробовал следующий способ, рисунок здесь.Успешно обновляет только от 16 до 19 содержимого из 100 повторяемых элементов, а затем выдает тот же error, что и без функции sleep().enter image description here

1 Ответ

0 голосов
/ 12 марта 2019

Скажите, что мне нужно запускать эту функцию каждые 150 мс:

const request = () => new Promise(res => setTimeout(() => { console.log('done'); res() }, 1000))
//

Тогда я могу использовать setTimeout рекурсивно, чтобы добавить задержку между каждым запросом:

let counter = 0;

// this handler will be passed into a setTimeout
// to kick off the whole thing
const handler = () => {
  console.log(counter);

  // request api thing
  request().then(() => {
    counter++;
    if (counter === 100) return;
    setTimeout(handler, 150) // remove this
  })
}

// kick off
setTimeout(handler, 150)

Он проверяет, завершен ли каждый запрос, прежде чем ждать запуска следующего.

...