2016-01-15 2 views
2

Я пытаюсь выполнить обещания с задержкой в ​​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 работает отлично.

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

Я ценю каждую помощь, которую я могу получить.

+0

@Quentin Youre собирается должны быть более конкретными, что функция, то 'itemsearch () 'или' prom.then() '? – Daedalus

+0

@Quentin youre собираюсь извинить меня, я все еще немного новичок в javascript и nodejs. Я не запускаю setimeout один раз, я запускаю его для каждого элемента в массиве категорий, см. 'Categories.reduce()'. И оператор return заключается в том, что внутри решения, пытающегося выполнить обещания, для них используются операторы return. – Daedalus

+0

@Quentin исправьте меня, если я ошибаюсь, но 'setTimeout' принимает первую переменную как функцию, а вторую - как задержку. Я не уверен, что я получаю то, что вы подразумеваете под единственной функцией, которую я передаю на 'setTimeout' – Daedalus

ответ

1

Использование async.eachSeries, вы можете обработать каждый из них последовательно и выполнить асинхронный обратный вызов через 1 секунду после того, как каждый запрос заканчивается:

async.eachSeries(categories, function(category, callback) { 
    client.itemSearch({ 
    searchIndex: configuration.SearchIndex, 
    CategoryID: category.id, 
    Keywords: currentKeyword 
    }).then(function(results) { 
    // we don't need to wait after the database here, just after the request 
    setTimeout(callback, 1000); 

    var title = results[0].Title; 
    var cat = category.name; 
    var price = results[0].Price; 

    db.insertProduct(title, cat, price); 
    }).catch(callback); 
}, function(err) { 
    if (err) { 
    console.log('error', err); 
    } 
}); 
Смежные вопросы