javascript - ব্লুবার্ডের সাথে নোডের চাইল্ড_প্রসেস.এক্সেক এবং চাইল্ড_প্রসেস.এেক্সেকফাইলে ফাংশনগুলি কীভাবে প্রচার করবেন?




node.js promise (4)

আমি নোড.জেএস এর অধীনে ব্লুবার্ড প্রতিশ্রুতি গ্রন্থাগারটি ব্যবহার করছি, দুর্দান্ত! তবে আমার একটি প্রশ্ন আছে:

আপনি যদি নোডের child_process.exec এবং child_process.execFile child_process.exec ডকুমেন্টেশনগুলি একবার দেখে থাকেন তবে দেখতে পাবেন যে এই দুটি ফাংশনই চাইল্ডপ্রসেস অবজেক্টকে ফিরিয়ে দিচ্ছে।

সুতরাং এই ধরনের ফাংশন প্রচারের প্রস্তাবিত উপায় কি?

নোট করুন যে নিম্নলিখিত কাজগুলি (আমি একটি প্রতিশ্রুতি বস্তু পাই):

var Promise = require('bluebird');
var execAsync = Promise.promisify(require('child_process').exec);
var execFileAsync = Promise.promisify(require('child_process').execFile);

তবে কীভাবে কেউ আসল নোড.জেএস ফাংশনগুলির মূল রিটার্ন মানটিতে অ্যাক্সেস পেতে পারেন? (এই ক্ষেত্রে আমার আসল প্রত্যাবর্তিত চাইল্ডপ্রসেস সামগ্রীগুলি অ্যাক্সেস করতে সক্ষম হওয়া প্রয়োজন))

যেকোন পরামর্শ সম্মানের সহিত গৃহীত হবে!

সম্পাদনা করুন:

এখানে একটি উদাহরণ কোড রয়েছে যা চাইল্ড_প্রসেস.এক্সেক ফাংশনের রিটার্ন মানটি ব্যবহার করছে:

var exec = require('child_process').exec;
var child = exec('node ./commands/server.js');
child.stdout.on('data', function(data) {
    console.log('stdout: ' + data);
});
child.stderr.on('data', function(data) {
    console.log('stderr: ' + data);
});
child.on('close', function(code) {
    console.log('closing code: ' + code);
});

তবে আমি যদি এক্সিকিউটিভ ফাংশনের (উপরে থেকে এক্সএকসিঙ্ক) প্রতিশ্রুতিবদ্ধ সংস্করণটি ব্যবহার করি তবে রিটার্ন মানটি একটি প্রতিশ্রুতি হবে, চাইল্ডপ্রসেস অবজেক্ট নয়। এটিই আমি বলছি আসল সমস্যা।


আমি ব্লুবার্ডের মতো অতিরিক্ত লাইব্রেরি নির্ভরতার উপর ভাষাটিতে নির্মিত স্ট্যান্ডার্ড জেএস প্রতিশ্রুতিগুলি ব্যবহার করার পরামর্শ দেব।

আপনি যদি নোড 10+ ব্যবহার করেন child_process.exec util.promisify ব্যবহার করার পরামর্শ util.promisify যা কোন Promise<{ stdout, stderr }> util.promisify Promise<{ stdout, stderr }> অবজেক্ট দেয়। নীচে একটি উদাহরণ দেখুন:

const util = require('util');
const exec = util.promisify(require('child_process').exec);

async function lsExample() {
  const { stdout, stderr } = await exec('ls');
  console.log('stdout:', stdout);
  console.log('stderr:', stderr);
}
lsExample()

stderr থেকে প্রথমে ত্রুটিগুলি পরিচালনা করুন।


এখানে অন্য উপায়:

function execPromise(command) {
    return new Promise(function(resolve, reject) {
        exec(command, (error, stdout, stderr) => {
            if (error) {
                reject(error);
                return;
            }

            resolve(stdout.trim());
        });
    });
}


execPromise(command).then(function(result) {
    console.log(result);
}).catch(function(e) {
    console.error(e.message);
});

বা অ্যাসিঙ্ক / প্রতীক্ষার সাথে:

try {
    var result = await execPromise(command);
} catch (e) {
    console.error(e.message);
}

দেখে মনে হচ্ছে আপনি কল থেকে দুটি জিনিস ফিরে আসতে চান:

  • চাইল্ডপ্রসেস
  • চাইল্ডপ্রসেস সম্পন্ন হলে একটি প্রতিশ্রুতি সমাধান হয়

সুতরাং "এই জাতীয় ফাংশন প্রচারের প্রস্তাবিত উপায়"? না

আপনি সম্মেলনের বাইরে আছেন outside প্রতিশ্রুতি ফেরত ফাংশন একটি প্রতিশ্রুতি প্রত্যাশিত আশা করা হয়, এবং এটি। আপনি দুটি সদস্য (চাইল্ডপ্রসেস এবং প্রতিশ্রুতি) দিয়ে কোনও বস্তু ফিরিয়ে দিতে পারেন, তবে এটি কেবল মানুষকে বিভ্রান্ত করবে।

আমি অনির্দিষ্টকৃত ফাংশনটি কল করার এবং প্রত্যাশিত চাইল্ডপ্রসেসের ভিত্তিতে একটি প্রতিশ্রুতি তৈরি করার পরামর্শ দেব। (সম্ভবত এটি কোনও সহায়ক ফাংশনে আবদ্ধ করুন)

এইভাবে, পরবর্তী ব্যক্তির পক্ষে কোডটি পড়ার পক্ষে এটি সম্পূর্ণ স্পষ্ট।

কিছুটা এইরকম:

var Promise = require('bluebird');
var exec = require('child_process').execFile;

function promiseFromChildProcess(child) {
    return new Promise(function (resolve, reject) {
        child.addListener("error", reject);
        child.addListener("exit", resolve);
    });
}

var child = exec('ls');

promiseFromChildProcess(child).then(function (result) {
    console.log('promise complete: ' + result);
}, function (err) {
    console.log('promise rejected: ' + err);
});

child.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
});
child.stderr.on('data', function (data) {
    console.log('stderr: ' + data);
});
child.on('close', function (code) {
    console.log('closing code: ' + code);
});

সমস্ত ব্যবহারের কেসগুলি কভার করে সুন্দরভাবে করার কোনও উপায় সম্ভবত নেই। তবে সীমিত ক্ষেত্রে আপনি এরকম কিছু করতে পারেন:

/**
 * Promisified child_process.exec
 *
 * @param cmd
 * @param opts See child_process.exec node docs
 * @param {stream.Writable} opts.stdout If defined, child process stdout will be piped to it.
 * @param {stream.Writable} opts.stderr If defined, child process stderr will be piped to it.
 *
 * @returns {Promise<{ stdout: string, stderr: stderr }>}
 */
function execp(cmd, opts) {
    opts || (opts = {});
    return new Promise((resolve, reject) => {
        const child = exec(cmd, opts,
            (err, stdout, stderr) => err ? reject(err) : resolve({
                stdout: stdout,
                stderr: stderr
            }));

        if (opts.stdout) {
            child.stdout.pipe(opts.stdout);
        }
        if (opts.stderr) {
            child.stderr.pipe(opts.stderr);
        }
    });
}

এটি opts.stdout এবং opts.stderr আর্গুমেন্ট গ্রহণ করে, যাতে opts.stderr শিশু প্রক্রিয়া থেকে ক্যাপচার করা যায়।

উদাহরণ স্বরূপ:

execp('ls ./', {
    stdout: new stream.Writable({
        write: (chunk, enc, next) => {
            console.log(chunk.toString(enc));
            next();
        }
    }),
    stderr: new stream.Writable({
        write: (chunk, enc, next) => {
            console.error(chunk.toString(enc));
            next();
        }
    })
}).then(() => console.log('done!'));

বা সহজভাবে:

execp('ls ./', {
    stdout: process.stdout,
    stderr: process.stderr
}).then(() => console.log('done!'));





bluebird