मैं वर्तमान में नोड.जेएस में एक ट्विच-समुदाय के लिए एक वेबप्रोजेक्ट पर काम कर रहा हूं। मैं प्रोफ़ाइल चित्रों को प्राप्त करने के लिए ट्विच एपीआई का उपयोग कर रहा हूं और पेज को प्रस्तुत करने से पहले, वस्तुओं की एक सरणी में उन्हें अन्य जानकारी के साथ जोड़ रहा हूं। दुर्भाग्य से मुझे केवल प्रोफ़ाइल चित्र URL के लिए एक लंबित वादा मिलेगा, जब पृष्ठ प्रस्तुत किया जाएगा। पृष्ठ के प्रस्तुत होने के बाद लगभग एक मिलीसेकंड, मुझे पीबी-लिंक्स के बारे में कंसोल लॉग मिलता है, इसलिए यह तेज़ हो जाता है, इसलिए मेरी राय में अजाक्स का कोई मतलब नहीं है। क्या पृष्ठ को प्रस्तुत करने के लिए स्क्रिप्ट के आगे बढ़ने से पहले वादे लोड होने तक प्रतीक्षा करने की कोई संभावना है?

पहले ही, आपका बहुत धन्यवाद

async function getStreamersPB(streamerName){
  var streamer = await twitch.getUsers(streamerName);
  var streamerPBURL = await streamer.data[0].profile_image_url;


  console.log(streamerPBURL);
}

...

router.get('/', (req, res) => {

  var streamer = [];
    con.query("SELECT * FROM xxx",  function (err, result) {
    if (err) {
      console.log(err);
    }
    if (result.length !== 0){
      for (let i = 0; i < result.length; i++) {
        let streamObj = {
          "id": result[i].id,
          "name": result[i].name,
          "website": result[i].website.toLowerCase(),
          "status": result[i].status,
          "rang": result[i].rang,
          "userPB": getStreamersPB(result[i].name)
        }
        console.log(streamObj);
        streamer.push(streamObj);
    }}});

    con.query("SELECT * FROM xxx WHERE xxx = '" + xxx + "'", function (err, result) {
    if (err) {
      console.log(err);
    } if(result.length === 1){
    res.render('home', {
      message: result[0].twitchName,
      userID: result[0].id,
      streamer: streamer
    });

...

वह मेरा कंसोल लॉग है:

{
  id: 1,
  name: 'xxx',
  website: 'xxx',
  status: 0,
  rang: 1,
  userPB: Promise { <pending> }
}
https://static-cdn.jtvnw.net/...xxx

1
Maggimann 25 अगस्त 2021, 18:55

4 जवाब

सबसे बढ़िया उत्तर

चूंकि आपको डायलन के उत्तर में त्रुटि प्राप्त हो रही है, इसलिए पहले com.query फ़ंक्शन में async जोड़ें।

router.get('/', async (req, res) => {

  var streamer = [];
    con.query("SELECT * FROM xxx", async function (err, result) {
    if (err) {
      console.log(err);
    }
    if (result.length !== 0){
      for (let i = 0; i < result.length; i++) {
        
        let streamObj = {
          "id": result[i].id,
          "name": result[i].name,
          "website": result[i].website.toLowerCase(),
          "status": result[i].status,
          "rang": result[i].rang
        }

        // getStreamersPB is an asynchronous method which you must await.
        streamObj.userPB = await getStreamersPB(result[i].name);

        console.log(streamObj);
        streamer.push(streamObj);
    }}});

    con.query("SELECT * FROM xxx WHERE xxx = '" + xxx + "'", function (err, result) {
    if (err) {
      console.log(err);
    } if(result.length === 1){
    res.render('home', {
      message: result[0].twitchName,
      userID: result[0].id,
      streamer: streamer
    });

}
0
infinite_verma 25 अगस्त 2021, 16:35

जैसा कि स्लीबेटमैन ने उल्लेख किया है, आपको एसिंक्स फ़ंक्शन कॉल का इंतजार करना होगा, अन्यथा आप अपने क्लाइंट को एक लंबित वादा भेजेंगे। यहाँ संशोधन के साथ आपका कोड है।

router.get('/', (req, res) => {

  var streamer = [];

  // This function has been marked as async so we can use await in it.
  con.query("SELECT * FROM xxx", async function (err, result) {

    if (err) {
      console.log(err);
    }

    if (result.length !== 0) {
      for (let i = 0; i < result.length; i++) {

        let streamObj = {
          "id": result[i].id,
          "name": result[i].name,
          "website": result[i].website.toLowerCase(),
          "status": result[i].status,
          "rang": result[i].rang
        }

        // getStreamersPB is an asynchronous method which you must await.
        streamObj.userPB = await getStreamersPB(result[i].name);

        console.log(streamObj);
        streamer.push(streamObj);
      }
    }

    // I moved this query to inside the callback for the first query
    // to ensure this query happens after the first one. Originally,
    // both `con.query` calls were being invoked at the same time, so
    // there's no garuntee in what order they execute.
    con.query("SELECT * FROM xxx WHERE xxx = '" + xxx + "'", function (err, result) {
      if (err) {
        console.log(err);
      } if (result.length === 1) {
        res.render('home', {
          message: result[0].twitchName,
          userID: result[0].id,
          streamer: streamer
        });
      }
    });

  });

});

0
Dylan Landry 25 अगस्त 2021, 16:36

मैंने इसे ठीक कर लिया! मैं अपने फंक्शन में रिटर्न स्टेटमेंट डालना भूल गया!

आपके उत्तरों और आपकी मदद के लिए सभी को बहुत-बहुत धन्यवाद !!!

0
Maggimann 25 अगस्त 2021, 17:15

आप पहले पृष्ठ को छिपाने के लिए सीएसएस का उपयोग कर सकते हैं, फिर जब आपके प्रोफ़ाइल चित्र लोड हो जाते हैं, तो सीएसएस को बदलने और पृष्ठ को प्रकट करने के लिए जावास्क्रिप्ट का उपयोग करें।

-1
Dylan Landry 25 अगस्त 2021, 16:02