Jika saya perlu memanggil 3 http API secara berurutan, apa alternatif yang lebih baik untuk kode berikut:
http.get({ host: 'www.example.com', path: '/api_1.php' }, function(res) {
res.on('data', function(d) {
http.get({ host: 'www.example.com', path: '/api_2.php' }, function(res) {
res.on('data', function(d) {
http.get({ host: 'www.example.com', path: '/api_3.php' }, function(res) {
res.on('data', function(d) {
});
});
}
});
});
}
});
});
}
node.js
synchronization
Howard
sumber
sumber
sync-request
perpustakaan, yang merupakan jawaban yang bagus untuk judul pertanyaan ini, tetapi bukan jawaban untuk apa yang tersirat dalam kode pertanyaan. Jawaban di bawah tentang Promises adalah jawaban yang lebih baik untuk itu. Apa maksudmuJawaban:
Menggunakan deferreds like
Futures
.Jika Anda perlu meneruskan cakupan maka lakukan saja sesuatu seperti ini
sumber
Saya suka solusi Raynos juga, tetapi saya lebih suka perpustakaan kontrol aliran yang berbeda.
https://github.com/caolan/async
Bergantung pada apakah Anda memerlukan hasil di setiap fungsi berikutnya, saya akan menggunakan seri, paralel, atau air terjun.
Seri ketika mereka harus dijalankan secara serial, tetapi Anda tidak memerlukan hasil di setiap pemanggilan fungsi berikutnya.
Paralel jika dapat dijalankan secara paralel, Anda tidak memerlukan hasil dari masing-masing selama setiap fungsi paralel, dan Anda memerlukan panggilan balik ketika semua telah selesai.
Air terjun jika Anda ingin mengubah hasil di setiap fungsi dan meneruskan ke fungsi berikutnya
sumber
Anda dapat melakukan ini menggunakan pustaka Common Node saya :
sumber
require(...).HttpClient is not a constructor
permintaan sinkronisasi
Sejauh ini, yang paling mudah saya temukan dan gunakan adalah permintaan sinkronisasi dan mendukung node dan browser!
Itu saja, tidak ada konfigurasi gila, tidak ada instalasi lib yang rumit, meskipun ia memiliki cadangan lib. Bekerja saja. Saya telah mencoba contoh lain di sini dan bingung ketika ada banyak pengaturan tambahan yang harus dilakukan atau pemasangan tidak berhasil!
Catatan:
Contoh yang digunakan permintaan sinkronisasi tidak berfungsi dengan baik saat Anda menggunakannya
res.getBody()
, semua yang dilakukan get body adalah menerima encoding dan mengonversi data respons. Lakukan sajares.body.toString(encoding)
sebagai gantinya.sumber
Saya akan menggunakan fungsi rekursif dengan daftar api
edit: versi permintaan
edit: request / versi async
sumber
Sepertinya solusi untuk masalah ini tidak pernah berakhir, ini satu lagi :)
http://alexeypetrushin.github.com/synchronize
sumber
Kemungkinan lainnya adalah mengatur panggilan balik yang melacak tugas yang sudah selesai:
Kemudian cukup tetapkan ID untuk masing-masing dan Anda dapat mengatur persyaratan Anda untuk tugas mana yang harus diselesaikan sebelum menutup koneksi.
Oke, ini tidak bagus. Ini hanyalah cara lain untuk melakukan panggilan berurutan. Sayangnya NodeJS tidak menyediakan panggilan sinkron yang paling dasar. Tapi saya mengerti apa iming-iming asinkronitas itu.
sumber
gunakan berurutan.
sudo npm menginstal sequenty
atau
https://github.com/AndyShin/sequenty
sangat sederhana.
Anda juga dapat menggunakan loop seperti ini:
sumber
Menggunakan pustaka permintaan dapat membantu meminimalkan cruft:
Tetapi untuk kehebatan maksimum Anda harus mencoba beberapa pustaka aliran kontrol seperti Langkah - ini juga akan memungkinkan Anda untuk memparalelkan permintaan, dengan asumsi itu dapat diterima:
sumber
Mulai 2018 dan menggunakan modul dan Janji ES6, kita dapat menulis fungsi seperti itu:
dan kemudian di modul lain
Kode perlu dijalankan dalam konteks asynchronous (menggunakan
async
kata kunci)sumber
Ada banyak pustaka aliran kontrol - Saya suka conseq (... karena saya yang menulisnya.) Juga,
on('data')
dapat diaktifkan beberapa kali, jadi gunakan pustaka pembungkus REST seperti restler .sumber
Ini telah dijawab dengan baik oleh Raynos. Namun ada perubahan dalam pustaka urutan sejak jawabannya telah diposting.
Agar urutan berfungsi, ikuti tautan ini: https://github.com/FuturesJS/sequence/tree/9daf0000289954b85c0925119821752fbfb3521e .
Beginilah cara Anda membuatnya berfungsi setelah
npm install sequence
:sumber
Berikut versi saya dari @ andy-shin secara berurutan dengan argumen dalam array, bukan indeks:
sumber
... 4 tahun kemudian ...
Berikut ini solusi asli dengan kerangka kerja Danf (Anda tidak memerlukan kode apa pun untuk hal semacam ini, hanya beberapa konfigurasi):
Jika Anda ingin menjadi lebih pendek, Anda dapat menggunakan proses pengumpulan:
Lihat ikhtisar kerangka kerja untuk informasi lebih lanjut.
sumber
Saya mendarat di sini karena saya perlu menilai-membatasi http.request (~ 10k kueri agregasi ke pencarian elastis untuk membuat laporan analitis). Berikut ini baru saja mencekik mesin saya.
URL saya sangat sederhana jadi ini mungkin tidak berlaku sepele untuk pertanyaan asli tetapi saya pikir itu berpotensi berlaku dan layak ditulis di sini untuk pembaca yang mendarat di sini dengan masalah yang mirip dengan saya dan yang menginginkan solusi JavaScript tanpa perpustakaan yang sepele.
Pekerjaan saya tidak tergantung pada pesanan dan pendekatan pertama saya untuk membungkus ini adalah membungkusnya dalam skrip shell untuk memotongnya (karena saya baru mengenal JavaScript). Itu fungsional tapi tidak memuaskan. Resolusi JavaScript saya pada akhirnya adalah melakukan hal berikut:
Sepertinya rekursi timbal balik antara collect dan get_top . Saya tidak yakin ini berlaku karena sistemnya asinkron dan fungsi kumpulkan selesai dengan callback yang disimpan untuk acara di on. ('End' .
Saya pikir ini cukup umum untuk diterapkan pada pertanyaan awal. Jika, seperti skenario saya, urutan / set diketahui, semua URL / kunci dapat didorong ke tumpukan dalam satu langkah. Jika mereka dihitung saat Anda melanjutkan, fungsi on ('end' dapat mendorong url berikutnya di tumpukan tepat sebelum get_top () . Jika ada, hasilnya memiliki lebih sedikit sarang dan mungkin lebih mudah untuk direfraktor ketika API yang Anda panggil perubahan.
Saya menyadari ini secara efektif setara dengan versi rekursif sederhana @ generalhenry di atas (jadi saya memberi suara positif!)
sumber
Permintaan Super
Ini adalah modul sinkron lain yang didasarkan pada permintaan dan menggunakan promise. Sangat mudah digunakan, bekerja dengan baik dengan tes mocha.
npm install super-request
sumber
Kode ini dapat digunakan untuk menjalankan larik promise secara sinkron & berurutan setelah Anda dapat menjalankan kode terakhir dalam
.then()
panggilan tersebut.sumber
Saya benar-benar mendapatkan apa yang Anda (dan saya) inginkan, tanpa menggunakan await, Promises, atau inklusi dari pustaka (eksternal) apa pun (kecuali milik kita sendiri).
Berikut cara melakukannya:
Kita akan membuat modul C ++ untuk digunakan bersama node.js, dan fungsi modul C ++ itu akan membuat permintaan HTTP dan mengembalikan data sebagai string, dan Anda dapat menggunakannya secara langsung dengan melakukan:
APAKAH ANDA SIAP untuk memulai?
Langkah 1: buat folder baru di tempat lain di komputer Anda, kami hanya menggunakan folder ini untuk membuat file module.node (dikompilasi dari C ++), Anda dapat memindahkannya nanti.
Di folder baru (saya meletakkan milik saya di mynewFolder / src untuk pengaturan-ness):
kemudian
sekarang buat 2 file baru: 1, bernama sesuatu.cpp dan untuk memasukkan kode ini di dalamnya (atau memodifikasinya jika Anda mau):
Sekarang buat file baru di direktori yang sama yang disebut
something.gyp
dan letakkan (seperti) ini di dalamnya:Sekarang di file package.json, tambahkan:
"gypfile": true,
Sekarang: di konsol,
node-gyp rebuild
Jika itu melewati seluruh perintah dan mengatakan "ok" di akhir tanpa kesalahan, Anda (hampir) baik untuk pergi, jika tidak, maka tinggalkan komentar ..
Tetapi jika berhasil, buka build / Release / cobypp.node (atau apa pun namanya untuk Anda), salin ke folder node.js utama Anda, lalu di node.js:
sumber