Результат object
вашего apiRequest ({ id: id, html: data };
) будет создан асинхронно после выполнения обещания.в этот момент переменной id
присвоено последнее значение.поэтому все создаваемые результирующие объекты будут иметь одинаковое значение.
Чтобы решить эту проблему, вы должны сохранять ссылку на свой идентификатор на каждом шаге for
.Поэтому определите array
, чтобы он сохранял сгенерированные идентификаторы, и вставьте в него каждый идентификатор, и, поскольку он имеет тот же порядок, что и apiRequests
, вы можете получить к ним доступ по индексу results
.
var apiRequests = [];
var ids = [];
// ...
apiRequests.push(/* ... */);
ids.push(id);
// ...
console.log(ids[i]);
Альтернативное решение будет использовать let
вместо var
, если это возможно.Как хорошо описано здесь :
var
ограничено до ближайшего функционального блока, а let - до ближайшего окружающего блока.
ЕслиВы определяете переменную let
внутри for
, уникальный экземпляр будет создаваться на каждом шаге, и, как указано в вашем объекте, он будет сохраняться до выхода из области действия функции.Таким образом, реализация будет выглядеть примерно так:
for (var i = 0; i < numIterations; i++) {
let finalId = id; // add this line
var requestDetails = {
uri: 'https://www.example.com/id=' + id,
json: false
};
apiRequests.push(
rp(requestDetails).then(
function (data) {
return {
id: finalId, // update this line
html: data
};
}
)
);
id++;
}
В качестве совета попробуйте использовать let
и const
вместо var