Я пытаюсь выполнить обещания с задержкой в 1 секунду друг от друга, так как сервер API, с которым я работаю, имеет ограничение 1 запрос за секунду.Обещание внутри settimeout
Вот мой код в настоящее время
var delay = 0;
return categories.reduce(function(promise, category) {
var id = setTimeout(function() {
promise.then(function() {
return client.itemSearch({
searchIndex: configuration.SearchIndex,
CategoryID: category.id,
Keywords: currentKeyword
}).then(function(results) {
var title = results[0].Title;
var cat = category.name;
var price = results[0].Price;
return db.insertProduct(title, cat, price);
});
}).catch(function(err) {
console.log("error", err);
});
}, delay * 1000);
delay += 1;
}, Promise.resolve());
каждый раз, когда она перебирает, это увеличивает задержку на один, так что следующий пункт будет начинаться с задержкой 1 дополнительной секунды.
Так, если его первый элемент, его 0 * 1 = 0, то 1 * 1 = 1, то 2 * 1 = 2 ... так далее
По некоторым причинам, он не работает, без settimeout работает отлично.
Насколько я могу судить, не должно возникнуть проблемы с началом обещания после задержки, если, возможно, это не имеет никакого отношения к переменным, не имеющим правильного значения после завершения задержки. Если это так, как я могу это исправить, возможно, перейдем к переменным?
Я ценю каждую помощь, которую я могу получить.
@Quentin Youre собирается должны быть более конкретными, что функция, то 'itemsearch () 'или' prom.then() '? – Daedalus
@Quentin youre собираюсь извинить меня, я все еще немного новичок в javascript и nodejs. Я не запускаю setimeout один раз, я запускаю его для каждого элемента в массиве категорий, см. 'Categories.reduce()'. И оператор return заключается в том, что внутри решения, пытающегося выполнить обещания, для них используются операторы return. – Daedalus
@Quentin исправьте меня, если я ошибаюсь, но 'setTimeout' принимает первую переменную как функцию, а вторую - как задержку. Я не уверен, что я получаю то, что вы подразумеваете под единственной функцией, которую я передаю на 'setTimeout' – Daedalus