ฉันจะเรียกใช้ฟังก์ชันเฉพาะเมื่อคำขอทั้งหมดเสร็จสิ้นได้อย่างไร

ขณะนี้ฉันกำลังสร้างคำขอสองสามรายการโดยใช้แพ็คเกจ npm request ดังนี้:

for (var i = 0; i < array.length; i++) {

    var options = {
        url: '...',
        headers: {
            '...'
        }
    };
    function callback(error, response, body) {

    };
    request(options, callback);

}


function toBeCalledWhenAllRequestsHaveFinished() {

}

ฉันไม่รู้ว่าจะโทรหา toBeCalledWhenAllRequestsHaveFinished() ได้อย่างไรก็ต่อเมื่อคำขอทั้งหมดเสร็จสิ้นแล้ว

ควรทำอย่างไร?


person TheProgrammer    schedule 28.06.2018    source แหล่งที่มา
comment
ทางเลือก - ใช้ Promise.all มันให้ความสำเร็จเมื่อคำขอของคุณทั้งหมดเสร็จสิ้น   -  person Aseem Upadhyay    schedule 28.06.2018
comment
ดูที่ davidwalsh.name/promises ตั้งแต่ปี 2015 แต่ก็ยังเป็นแหล่งข้อมูลที่ดีในการทำความเข้าใจคำสัญญา   -  person Sebastiaan van Arkens    schedule 28.06.2018
comment
ใช้โมดูลอินเทอร์เฟซ request นี้ โดยทำตามลิงก์ GitHub นี้   -  person Alex    schedule 28.06.2018


คำตอบ (1)


ฉันขอแนะนำเป็นอย่างยิ่งให้ใช้แพ็คเกจ node-fetch

อ้างอิงถึงผู้โพสต์ต้นฉบับ


ติดตั้ง node-fetch โดยใช้ npm install node-fetch --save

ทำการดึงข้อมูลแบบส่งคืนตามสัญญาที่แก้ไขเป็น JSON

const fetch = require('node-fetch');
function fetchJSON(url) {
    // Add options
    var options = {
        headers: {
            '...'
        }
    };
    return fetch(url, options).then(response => response.json());
}

สร้างอาร์เรย์ของคำสัญญาจากอาร์เรย์ของ URL

let urls = [url1, url2, url3, url4];
let promises = urls.map(url => fetchJSON(url));

โทร toBeCalledWhenAllRequestsHaveFinished() เมื่อคำสัญญาทั้งหมดได้รับการแก้ไขแล้ว

Promise.all(promises).then(responses => toBeCalledWhenAllRequestsHaveFinished(responses));
person Alex    schedule 28.06.2018
comment
หากคุณต้องทำซ้ำคำตอบทั้งหมด คุณควรปิดคำถามนี้ว่าซ้ำกัน - person str; 28.06.2018
comment
คำตอบในโพสต์ไม่ได้ทำเครื่องหมายเป็น Best Answer ดังนั้นจนกว่าจะถึงเวลานั้น ก็ไม่มีประโยชน์ที่จะตั้งค่าสถานะสิ่งนี้ - person Alex; 28.06.2018
comment
นั่นไม่สำคัญ เป็นคำถามที่ได้รับการโหวตมากที่สุดอย่างน้อย - person str; 28.06.2018
comment
คือถ้าคุณต้องการตั้งค่าสถานะโพสต์นี้ฉันจะไม่หยุดคุณ - person Alex; 28.06.2018
comment
แล้วตัวเลือกล่ะ? - person TheProgrammer; 28.06.2018
comment
@TheProgrammer ตรวจสอบรหัสที่อัพเดต คุณควรอ่านเอกสารด้วย - person Alex; 28.06.2018
comment
@TheProgrammer ยังไปที่ node-fetch npm webiste, Ctrl+F และค้นหา fetch(url[, options]) - person Alex; 28.06.2018
comment
@Alex ฉันได้รับ {"size":0,"timeout":0} เป็นการตอบกลับ - person TheProgrammer; 28.06.2018
comment
ฉันค่อนข้างแน่ใจว่าตัวเลือกต่างๆ จำเป็นต้องห่อไว้ ฉันไม่เคยใช้ node-fetch ตรวจสอบเอกสารประกอบและลองทำตามที่กล่าวไว้ - person Alex; 28.06.2018
comment
@Alex ฉันไม่สามารถยอมรับคำตอบที่ไม่สมบูรณ์ตามกฎ SO ได้ - person TheProgrammer; 28.06.2018
comment
ฉันคิดว่าคุณต้องล้อมตัวเลือกของคุณใน {} เช่น ` return fetch(url, {options})` - person Alex; 28.06.2018
comment
@TheProgrammer ฉันไม่ได้มุ่งเน้นไปที่ Accepted Answer ฉันมุ่งเน้นที่การทำให้โค้ดของคุณทำงานได้ - person Alex; 28.06.2018
comment
@TheProgrammer ค้นหา // post with JSON บน bitinn/node-fetch github โดยจะแสดงวิธีเพิ่มส่วนหัวและตัวเลือกอื่นๆ - person Alex; 28.06.2018
comment
@Alex ถ้าฉันทำอย่างนั้นการตอบกลับก็ใช้ได้ แต่ฉันต้องสามารถแก้ไขข้อมูลที่ถูกส่งกลับในการตอบกลับแต่ละครั้งได้ ฉันกำลังลอง: }).then(function(response) { console.log(RESPONSE: +JSON.stringify(response)); แต่มันล้มเหลว - person TheProgrammer; 28.06.2018
comment
@Alex แก้ไขคำถาม - person TheProgrammer; 28.06.2018
comment
@TheProgrammer คุณได้เพิ่ม responses อาร์กิวเมนต์ในฟังก์ชัน toBeCalledWhenAllRequestsHaveFinished() ของคุณแล้ว เพิ่มเข้าไปและภายในฟังก์ชันนั้นให้ทำ console.log(responses) - person Alex; 28.06.2018
comment
@Alex แก้ไขคำถามของฉันด้วยรหัสเทียมแบบเต็มตอนนี้เพื่อให้คุณได้ภาพที่ดีขึ้นเกี่ยวกับสิ่งที่ฉันต้องการทำ (ยังคงได้รับคำตอบเดิมหลังจากเพิ่มสิ่งที่คุณแนะนำ) - person TheProgrammer; 28.06.2018
comment
@str คุณรู้ไหมว่าเกิดอะไรขึ้นที่นี่? - person TheProgrammer; 28.06.2018
comment
ในที่สุดก็พบวิธีแก้ปัญหา คุณชี้ให้ฉันไปในทิศทางที่ถูกต้อง คำตอบที่ได้รับการยอมรับและโหวตขึ้น: D ขอให้มีความสุขมาก ๆ ในวันนี้! - person TheProgrammer; 28.06.2018
comment
เป็นเรื่องดีที่ได้ยิน ยินดีที่จะช่วยเหลือ! :) @TheProgrammer - person Alex; 28.06.2018