Async দিয়ে ফাইলটি কীভাবে পড়বেন / সঠিকভাবে অপেক্ষা করবেন?


120

আমি চিন্তা করতে পারে না async/ awaitকাজ করে। আমি এটি সামান্য বুঝতে পারি তবে আমি এটি কাজ করতে পারি না।

function loadMonoCounter() {
    fs.readFileSync("monolitic.txt", "binary", async function(err, data) {
       return await new Buffer( data);
  });
}

module.exports.read = function() {
  console.log(loadMonoCounter());
};

আমি জানি আমি ব্যবহার করতে readFileSyncপারি, তবে আমি যদি তা করি তবে আমি জানি না আমি কখনই বুঝতে পারব না async/ awaitএবং আমি কেবল বিষয়টিটি সমাহিত করব।

লক্ষ্য: কল করুন loadMonoCounter()এবং কোনও ফাইলের বিষয়বস্তু ফিরিয়ে দিন।

সেই ফাইলটি প্রতিবার বাড়ানো incrementMonoCounter()হয় (প্রতিটি পৃষ্ঠার বোঝা)। ফাইলটি বাইনারিতে একটি বাফারের ডাম্প ধারণ করে এবং একটি এসএসডিতে সঞ্চিত থাকে।

আমি যাই করি না কেন, আমি একটি ত্রুটি বা undefinedকনসোলে পেয়েছি ।


এটা কি তোমার প্রশ্নের উত্তর?
Async

উত্তর:


165

ব্যবহার করতে await/ asyncআপনার কাছে এমন পদ্ধতিগুলির দরকার যা প্রতিশ্রুতি ফেরত দেয়। কোর এপিআই ফাংশনগুলি এমনভাবে মোড়ানো ছাড়া এটি করে না promisify:

const fs = require('fs');
const util = require('util');

// Convert fs.readFile into Promise version of same    
const readFile = util.promisify(fs.readFile);

function getStuff() {
  return readFile('test');
}

// Can't use `await` outside of an async function so you need to chain
// with then()
getStuff().then(data => {
  console.log(data);
})

একটি নোট হিসাবে, readFileSyncকলব্যাক নেয় না, এটি ডেটা ফেরত দেয় বা ব্যতিক্রম ছুঁড়ে। আপনি যে মানটি চান তা পাচ্ছেন না কারণ আপনার সরবরাহ করা ফাংশনটি উপেক্ষা করা হয় এবং আপনি আসল ফেরতের মানটি ক্যাপচার করছেন না।


3
ধন্যবাদ, আমি জানতাম না যে আমাকে কোর এপিআই মোড়ানো দরকার। তুমি দারুন.
জেরেমি ডিকায়ার

4
মূল এপিআই আধুনিক প্রতিশ্রুতি নির্দিষ্টকরণ এবং async/ গ্রহণের প্রাক-তারিখ করে await, সুতরাং এটি একটি প্রয়োজনীয় পদক্ষেপ। সুসংবাদটি হ'ল promisifyএটি কোনও গোলযোগ ছাড়াই কাজ করে।
tadman

1
এটি সাধারণত এফএসের সাথে অ্যাসিঙ্ক-অপেক্ষার সুবিধা অর্জন করতে না পারার গোলমাল পরিচালনা করে। এই জন্য আপনাকে ধন্যবাদ! তুমি আমাকে এক টন বাঁচিয়েছ! সত্যিই আপনার মত এটি সম্বোধনের কোনও উত্তর নেই।
জ্যাকোফোসন

3
এটি অনুগ্রহ করে নিখরচায় অপ্রয়োজনীয় কারণ এটি অনুমান করা যায়। আপনি যদি উদাহরণস্বরূপ স্পষ্টভাবে অপেক্ষা করতে চান তবেই আপনি এটি করতে পারেন const file = await readFile...; return file;
বিগাহাণুবার্গার

1
@ শিজিন যতক্ষণ না নোড কোর এপিআই প্রতিশ্রুতিগুলিতে স্যুইচ করে, যা এই মুহুর্তে সম্ভাবনা নেই, তবে হ্যাঁ। যদিও এনপিএম মোড়ক আপনার জন্য এটি করে।
tadman

150

নোড ভি 11.0.0 এফএস প্রতিশ্রুতিগুলি স্থানীয়ভাবে ছাড়া পাওয়া যায় promisify:

const fs = require('fs').promises;
async function loadMonoCounter() {
    const data = await fs.readFile("monolitic.txt", "binary");
    return new Buffer(data);
}

4
কোনও অতিরিক্ত libs, পরিষ্কার এবং সহজ - এই উত্তরের উত্তর দেওয়া উচিত
অ্যাডাম বুবেলা

2
21-অক্টোবর
-2018 অনুসারে, ভি 12

16
import { promises as fs } from "fs";আপনি যদি আমদানি বাক্য গঠন ব্যবহার করতে চান।
tr3online

21

এটি @ জোয়েলের উত্তরের টাইপস্ক্রিপ্ট সংস্করণ। নোড 11.0 এর পরে এটি ব্যবহারযোগ্য:

import { promises as fs } from 'fs';

async function loadMonoCounter() {
    const data = await fs.readFile('monolitic.txt', 'binary');
    return Buffer.from(data);
}

18

আপনি সহজেই এমন প্রতিশ্রুতি দিয়ে রিডফিল কমান্ডটি মোড়ানো করতে পারেন:

async function readFile(path) {
    return new Promise((resolve, reject) => {
      fs.readFile(path, 'utf8', function (err, data) {
        if (err) {
          reject(err);
        }
        resolve(data);
      });
    });
  }

তারপরে ব্যবহার করুন:

await readFile("path/to/file");

অ্যাসিঙ্ক ফাংশনের অভ্যন্তরে অপেক্ষা করা হয় না?
বিকাশভাট

@ ভিকাসভাট হ্যাঁ, উপরে প্রতীক্ষিত লাইনটি অন্য একটি অ্যাসিঙ্ক ফাংশনের অভ্যন্তরে ব্যবহৃত হবে কারণ এই অনুমানটিটি এটির প্রয়োজন।
whoshotdk

8

আপনি fs.promisesনোড v11.0.0 থেকে স্থানীয়ভাবে উপলব্ধ ব্যবহার করতে পারেন

import fs from 'fs';

const readFile = async filePath => {
  try {
    const data = await fs.promises.readFile(filePath, 'utf8')
    return data
  }
  catch(err) {
    console.log(err)
  }
}

আপনি যদি কেবল প্রতিশ্রুতি ব্যবহার করতে চান তবে আপনি এমন কিছু করতে পারেনconst fs = require('fs').promises
নাথানফ্রানেকে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.