मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि मैं एक निश्चित फ़ंक्शन के लिए अपनी संपत्ति रखने और उन पर काम करने के लिए एक अस्थायी कार्य फ़ोल्डर बनाना चाहता हूं।

इसलिए:

await function someFunc() {
    createFolder()
    ...
    makeSomeFiles()
    doOtherStuff()
    ...
    deleteFolder()
}

लेकिन जिन कार्यों का मैं उपयोग कर रहा हूं, node.js में, सभी async हैं। एक फ़ोल्डर बनाना fs.mkdir() है और किसी फ़ोल्डर को हटाना fs.rmdir() है और छवियों को डाउनलोड करना और उन्हें सहेजना भी किसी प्रकार की एक async प्रक्रिया है।

समस्या यह है: बीच में किसी भी कोड के निष्पादित होने से पहले फ़ोल्डर बनाया और हटा दिया जाता है। तो मुझे मध्य खंड कोड से त्रुटियां मिलती हैं कि फ़ोल्डर मौजूद नहीं है, क्योंकि यह समय से पहले हटा दिया जाता है। मैं fs.rmdir() कैसे बनाऊं, अंत में, फ़ोल्डर को हटाने से पहले, सभी मध्य कोड के पहले चलने की प्रतीक्षा करें।

विशिष्ट कोड यह है:

async function run() {
    //GENERATE SESSION ID AND FOLDER
    const sessionID = str.random(50);
    fs.mkdir('images/'+sessionID, (err) => {
        if (err) return err;
    });

    //DOWNLOAD IMAGE
    https.get('https://en.wikipedia.org/wiki/Main_Page#/media/File:RE_Kaja_Kallas.jpg', (file) => {
        file.pipe(fs.createWriteStream('images/'+sessionID+'/image.jpeg'));
    });


    //CLEANUP
    fs.rmdir('images/'+sessionID, { recursive: true }, (err) => {
        if (err) return err;
    });
}
0
GeekOverdose 29 जिंदा 2021, 00:05
4
Async फ़ंक्शन someFunc () {प्रतीक्षा करें createFolder () ... प्रतीक्षा करें makeSomeFiles () प्रतीक्षा करें doOtherStuff () ... प्रतीक्षा करें deleteFolder ()}
 – 
Carlos Alves Jorge
29 जिंदा 2021, 00:06
1
... या एसिंक्रोनस नोड फ़ंक्शंस द्वारा लौटाए गए वादों का उपयोग करें। यह प्रतीक्षा का उपयोग करने से थोड़ा अधिक कोड है, लेकिन कुछ काम समवर्ती रूप से करने की अनुमति दे सकता है।
 – 
meriton
29 जिंदा 2021, 00:14
1
आपको createFolder() जैसे कार्यों के आंतरिक भाग को ठीक से लिखना होगा ताकि वे या तो एक वादा वापस कर दें जो फ़ंक्शन के अंदर संचालन होने पर हल हो जाए या आपको कॉलबैक में पास करना होगा और फ़ंक्शन को कॉल करने के लिए डिज़ाइन किया जाना चाहिए। कॉलबैक जब सब कुछ किया जाता है। आप इसे बाहर से ठीक नहीं कर सकते। आपको इन फंक्शन के इनसाइड को ठीक से डिजाइन करना होगा।
 – 
jfriend00
29 जिंदा 2021, 00:21

1 उत्तर

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

मैं उन कार्यों के वादे-आधारित संस्करणों का उपयोग करूंगा जो इन कार्यों को करते हैं और फिर उन वादों के साथ async/await का उपयोग करते हैं:

const stream = require('stream');
const {promisify} = require('util');
const fs = require('fs');
const fsp = fs.promises;
const got = require('got');

const pipeline = promisify(stream.pipeline);

async function run() {
     const sessionID = str.random(50);
     const dir = 'images/'+sessionID;
     await fsp.mkdir(dir);

     await pipeline(
         got.stream('https://en.wikipedia.org/wiki/Main_Page#/media/File:RE_Kaja_Kallas.jpg'),
         fs.createWriteStream(dir + '/image.jpeg')
     );

     // not sure why you're trying to remove a directory that you just 
     // put a file in so it's not empty
     await fsp.rmdir(dir, { recursive: true })
}

run().then(() => {
    console.log("all done");
}).catch(err => {
    console.log(err);
});

लेकिन, यह फ़ंक्शन मेरे लिए बहुत मायने नहीं रखता है क्योंकि आप एक निर्देशिका बना रहे हैं, उसमें एक फ़ाइल डाउनलोड कर रहे हैं और फिर एक गैर-रिक्त निर्देशिका को निकालने का प्रयास कर रहे हैं।

यह फ़ाइल डाउनलोड करने के लिए पुस्तकालय got() का उपयोग करता है क्योंकि यह http अनुरोधों के लिए मेरी गोटो लाइब्रेरी है क्योंकि इसमें स्ट्रीम और वादा इंटरफेस दोनों हैं।

2
jfriend00 29 जिंदा 2021, 00:34
स्ट्रीम में एक .promises भी होता है, आप util.promisify के बजाय उसका उपयोग कर सकते हैं
 – 
Zac Anger
29 जिंदा 2021, 00:30
- हाँ, यदि आप v15. मैं अभी तक यह मानने को तैयार नहीं था, लेकिन लोगों को देखने और जानने के लिए यह एक उपयोगी टिप्पणी है।
 – 
jfriend00
29 जिंदा 2021, 00:32
ओह, अच्छी बात... मैं भूल जाता हूँ कि हर कोई हर समय नवीनतम संस्करण नहीं चलाता...
 – 
Zac Anger
29 जिंदा 2021, 00:32
बाद में इसे हटाने का कारण यह है कि मेरे पास बाद में छवि पर काम करने के लिए कोड है, और परिणामों को कहीं और संग्रहीत करता है। इसलिए मैं एक अस्थायी फ़ोल्डर बनाना चाहता हूं, छवि डाउनलोड करना चाहता हूं, उसका विश्लेषण करना चाहता हूं, परिणामों को कहीं और स्टोर करना चाहता हूं, फ़ोल्डर हटाना चाहता हूं
 – 
GeekOverdose
29 जिंदा 2021, 00:35
प्रश्न: जहाँ तक मेरी जानकारी है, fs.rmdir और fs.mkdir async हैं। उनके सिंक समकक्ष fs.rmdirSync और fs.mkdirSync हैं। तो fs.rmdir fs.mkdir और fsp.mkdir fps.rmdir में क्या अंतर है। क्या वे दोनों अतुल्यकालिक नहीं हैं?
 – 
GeekOverdose
29 जिंदा 2021, 00:40