Jestem pewien, że mój problem jest oparty na braku zrozumienia programowania asynch w node.js, ale tutaj jest.Node.JS: Jak przekazywać zmienne do asynchronicznych wywołań zwrotnych?
Na przykład: Mam listę linków, które chcę indeksować. Kiedy każde żądanie asynchroniczne się zwraca, chcę wiedzieć, do którego adresu URL służy. Jednak, prawdopodobnie ze względu na warunki wyścigu, każde żądanie powraca z adresem URL ustawionym na ostatnią wartość na liście.
var links = ['http://google.com', 'http://yahoo.com'];
for (link in links) {
var url = links[link];
require('request')(url, function() {
console.log(url);
});
}
oczekiwany wynik:
http://google.com
http://yahoo.com
Rzeczywista moc:
http://yahoo.com
http://yahoo.com
Więc moje pytanie jest:
- Jak mogę przekazać URL (w ujęciu wartościowym) do funkcja oddzwaniania? LUB
- Jaki jest właściwy sposób łączenia żądań HTTP, aby były uruchamiane sekwencyjnie? LUB
- Coś jeszcze brakuje?
PS: Dla 1. Nie chcę rozwiązania, które bada parametry wywołania zwrotnego, ale ogólny sposób wywołania zwrotnego, wiedząc o zmiennych "z góry".
Tu nie chodzi o zakres. Chodzi o zamknięcia. Wiele innych języków nie ma zasięgu blokowego, ale nie napotyka tego problemu z powodu braku zamknięć. – slebetman
Chodzi o to, że jeśli JavaScript wspierał zakres blokowy, to dostęp do zamknięcia 'url' w funkcji wywołania zwrotnego kodu OP działałby, ponieważ każda iteracja pętli otrzymywałaby własną zmienną url (jak w C#). – JohnnyHK
Wymaganie jest tam dla zwięzłości, w moim kodeksie wszystkie wymagania są na początku. – Marc