গুল্প ত্রুটি: নিম্নলিখিত কাজগুলি সম্পূর্ণ হয়নি: আপনি কি অ্যাসিঙ্ক সমাপ্তির সংকেত দিতে ভুলে গেছেন?


211

আমার কাছে নিম্নলিখিত gulpfile.js রয়েছে , যা আমি কমান্ড লাইন গুল্প বার্তার মাধ্যমে সম্পাদন করছি :

var gulp = require('gulp');

gulp.task('message', function() {
  console.log("HTTP Server Started");
});

আমি নিম্নলিখিত ত্রুটি বার্তা পাচ্ছি:

[14:14:41] Using gulpfile ~\Documents\node\first\gulpfile.js
[14:14:41] Starting 'message'...
HTTP Server Started
[14:14:41] The following tasks did not complete: message
[14:14:41] Did you forget to signal async completion?

আমি উইন্ডোজ 10 সিস্টেমে ঝাল 4 ব্যবহার করছি। এখানে থেকে আউটপুট gulp --version:

[14:15:15] CLI version 0.4.0
[14:15:15] Local version 4.0.0-alpha.2

1
আপনি যদি এখানে থাকেন কারণ আপনার সাথে সমস্যা হয়েছে webpack-stream। এটি ব্যবহার করুন: github.com/shama/webpack-stream/issues/…
B3none

উত্তর:


448

যেহেতু আপনার টাস্কে অ্যাসিক্রোনাস কোড থাকতে পারে আপনার কাজ শেষ করার পরে আপনাকে গল্প সিগন্যাল করতে হবে (= "অ্যাসিঙ্ক সমাপ্তি")।

গুল্প 3.x এ আপনি এটি না করেই পালাতে পারবেন। আপনি যদি সুস্পষ্টভাবে অ্যাসিঙ্ক সমাপ্তির ঝাঁকুনিটি সিগন্যাল না করেন তবে কেবল ধরে নেওয়া হবে যে আপনার টাস্কটি সুসংগত এবং আপনার টাস্ক ফাংশনটি ফিরে আসার সাথে সাথে এটি শেষ হয়ে গেছে। গুলপ 4.x এই ক্ষেত্রে কঠোর। আপনি করতে হবে স্পষ্টভাবে কাজটি সমাপ্তির সংকেত দেন।

আপনি এটি ছয়টি উপায়ে করতে পারেন :

1. একটি স্ট্রিম ফিরে

আপনি যদি কেবল কিছু মুদ্রণের চেষ্টা করছেন তবে এটি সত্যিই কোনও বিকল্প নয়, তবে আপনি সাধারণত ঝাল স্ট্রিমের সাথে কাজ করছেন বলে এটি সম্ভবত সবচেয়ে ঘন ঘন ব্যবহৃত অ্যাসিঙ্ক সমাপ্তির প্রক্রিয়া। আপনার ব্যবহারের ক্ষেত্রে এটি প্রদর্শিত (বরং স্বীকৃত) উদাহরণ:

var print = require('gulp-print');

gulp.task('message', function() {
  return gulp.src('package.json')
    .pipe(print(function() { return 'HTTP Server Started'; }));
});

এখানে গুরুত্বপূর্ণ অংশটি হল returnবিবৃতি। আপনি যদি স্ট্রিমটি ফিরিয়ে না দেন, কবে স্ট্র্যাপটি শেষ হবে তা নির্ধারণ করতে পারে না।

2. রিটার্ন a Promise

এটি আপনার ব্যবহারের ক্ষেত্রে আরও উপযুক্ত সরঞ্জাম। মনে রাখবেন যে বেশিরভাগ সময় আপনাকে Promiseঅবজেক্টটি নিজে তৈরি করতে হবে না , এটি সাধারণত কোনও প্যাকেজ সরবরাহ করে (যেমন ঘন ঘন ব্যবহৃত delপ্যাকেজটি একটি দেয় Promise)।

gulp.task('message', function() { 
  return new Promise(function(resolve, reject) {
    console.log("HTTP Server Started");
    resolve();
  });
});

অ্যাসিঙ্ক / অপেক্ষার সিন্ট্যাক্স ব্যবহার করে এটিকে আরও সহজ করা যায়। সমস্ত ফাংশন asyncস্পষ্টভাবে একটি প্রতিশ্রুতি ফেরত দেয় যাতে নিম্নলিখিতগুলিও খুব কার্যকর হয় (যদি আপনার নোড.জেএস সংস্করণ এটি সমর্থন করে ):

gulp.task('message', async function() {
  console.log("HTTP Server Started");
});

3. কলব্যাক ফাংশন কল করুন

এটি সম্ভবত আপনার ব্যবহারের ক্ষেত্রে সহজতম উপায়: গল্পটি স্বয়ংক্রিয়ভাবে একটি কলব্যাক ফাংশনকে তার প্রথম যুক্তি হিসাবে আপনার কাজটিতে পাস করে। আপনার কাজ শেষ হয়ে গেলে কেবল সেই ফাংশনটি কল করুন:

gulp.task('message', function(done) {
  console.log("HTTP Server Started");
  done();
});

৪. সন্তানের প্রক্রিয়াটি ফিরিয়ে দিন

এটি বেশিরভাগ ক্ষেত্রে দরকারী যদি আপনাকে সরাসরি কোনও কমান্ড লাইন সরঞ্জাম শুরু করতে হয় কারণ কোনও নোড.জেএস র‌্যাপার উপলব্ধ নেই। এটি আপনার ব্যবহারের ক্ষেত্রে কাজ করে তবে স্পষ্টতই আমি এটির সুপারিশ করব না (বিশেষত যেহেতু এটি খুব বেশি বহনযোগ্য নয়):

var spawn = require('child_process').spawn;

gulp.task('message', function() {
  return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});

5. একটি আরএক্সজেএসObservable ফেরত দিন

আমি এই প্রক্রিয়াটি কখনও ব্যবহার করি নি, তবে আপনি যদি আরএক্সজেএস ব্যবহার করেন তবে এটি কার্যকর হতে পারে। আপনি কেবল কিছু মুদ্রণ করতে চাইলে এটি একধরণের ওভারকিল:

var of = require('rxjs').of;

gulp.task('message', function() {
  var o = of('HTTP Server Started');
  o.subscribe(function(msg) { console.log(msg); });
  return o;
});

6. রিটার্ন একটি EventEmitter

পূর্ববর্তীটির মতো আমি এটি সম্পূর্ণতার জন্য অন্তর্ভুক্ত করছি তবে আপনি ইতিমধ্যে EventEmitterকোনও কারণ ব্যবহার না করে আপনি এটি ব্যবহার করছেন এমন কিছু নয়।

gulp.task('message3', function() {
  var e = new EventEmitter();
  e.on('msg', function(msg) { console.log(msg); });
  setTimeout(() => { e.emit('msg', 'HTTP Server Started'); e.emit('finish'); });
  return e;
});

4
কয়েক ঘন্টা গুগল করার পরে আমি এই উদাহরণটি পেয়েছি। খুব উপকারী. ধন্যবাদ!
প্যাক্টর

এটি আমার পক্ষে সহায়ক!
আনান

1
আমি আপনার উত্তর প্রশংসা করি। +1 বড় সময়।
কনরাড ভিল্টারস্টন

6
আমি 17 ই নভেম্বর আপনার মার্জিত এবং তথ্যমূলক উত্তর প্রশংসা করি। এবং আজ, বড়দিনের দিনে, আমি আবার এটির সমস্ত প্রশংসা করছি। এটি এমন একটি ক্ষেত্রে যখন আমি ইচ্ছা করি আমি +২ পুরস্কার দিতে পারব ... আমি বিশ্বাস করতে পারি না যে " নীচের কাজগুলি সম্পন্ন হয়নি " বা " আপনি কি নীচের কাজগুলি শেষ করেননি " যখন সন্ধান করছেন তখন গুলোর্চিং এই লিঙ্কটিকে শীর্ষ # 1 হিসাবে ছাড়বে না you
অ্যাসিঙ্ক

"প্রায়শই ব্যবহৃত ডেল প্যাকেজ একটি প্রতিশ্রুতি দেয়"। আমি ডেল ব্যবহার করছি, যদিও প্রতিশ্রুতির সুযোগ নিতে আমি আমার গুল্প কোডটি লিখব? (পিএস।
পুরো

84

গুলপ 4 নিয়ে একটি সমস্যা

এই সমস্যাটি সমাধানের জন্য আপনার বর্তমান কোডটি পরিবর্তন করার চেষ্টা করুন:

gulp.task('simpleTaskName', function() {
  // code...
});

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

gulp.task('simpleTaskName', async function() {
  // code...
});

বা এটিতে:

gulp.task('simpleTaskName', done => {
  // code...
  done();
});

2
করাটা মিস করা আমার সমস্যা ছিল। আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ!
মার্কো সান্তারোসা

1
তবে সচেতন থাকুন যে তীর ফাংশনগুলির কোনও পৃথক সুযোগ নেই।
জেপজেড


13

খুব সাধারণ SASS / CSS বিল্ড চালানোর চেষ্টা করার সময় আমি এই একই ত্রুটিটি পাচ্ছিলাম ।

আমার সমাধানটি (যা এটি একই বা অনুরূপ ত্রুটিগুলি সমাধান করতে পারে) কেবলমাত্র doneডিফল্ট টাস্ক ফাংশনে একটি প্যারামিটার হিসাবে যুক্ত করা এবং এটি ডিফল্ট টাস্কের শেষে কল করা ছিল:

// Sass configuration
var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function () {
    gulp.src('*.scss')
        .pipe(sass())
        .pipe(gulp.dest(function (f) {
            return f.base;
        }))
});

gulp.task('clean', function() {
})

gulp.task('watch', function() {
    gulp.watch('*.scss', ['sass']);
})


gulp.task('default', function(done) { // <--- Insert `done` as a parameter here...
    gulp.series('clean','sass', 'watch')
    done(); // <--- ...and call it here.
})

আশাকরি এটা সাহায্য করবে!


7
প্রকৃত টাস্ক সামগ্রীগুলির সাথে উদাহরণটি দেখে ভাল
জোনাথন

8

আপনার দুটি জিনিস করা দরকার:

  1. asyncফাংশন আগে যোগ করুন ।
  2. দিয়ে আপনার ফাংশন শুরু করুন return

    var gulp = require('gulp');
    
    gulp.task('message', async function() {
        return console.log("HTTP Server Started");
    });

7

আমি এ সম্পর্কে খুব জ্ঞানী বলে দাবি করতে পারি না তবে আমার একই সমস্যা ছিল এবং এটি সমাধান করেছি।

এটির সমাধানের জন্য অ্যাসিঙ্ক ফাংশনটি ব্যবহার করে a ম উপায় রয়েছে ।

আপনার ফাংশনটি লিখুন তবে উপসর্গটি async যুক্ত করুন

এই গুল্পটি করার মাধ্যমে একটি প্রতিশ্রুতিতে ফাংশনটি মোড়ানো হয় এবং ত্রুটি ছাড়াই টাস্কটি চলবে।

উদাহরণ:

async function() {
  // do something
};

সম্পদ:

  1. গুলপ পৃষ্ঠার শেষ বিভাগ অ্যাসিঙ্ক সমাপ্তি : অ্যাসিঙ্ক ব্যবহার / অপেক্ষা করুন

  2. মোজিলা অ্যাসিঙ্ক ডকগুলি ফাংশন করে


7

গল্প সংস্করণ 3 থেকে 4 এ স্থানান্তর করার সময় এটি একটি সমস্যা, কেবল আপনি কল ব্যাক ফাংশনে সম্পন্ন একটি পরামিতি যুক্ত করতে পারেন, উদাহরণটি দেখুন,

   const gulp = require("gulp")

    gulp.task("message", function(done) {
      console.log("Gulp is running...")
      done()
    });

5

কার্যকারণ: আমাদের কলব্যাক ফাংশন (টাস্ক এবং বেনামে) কল করতে হবে:

function electronTask(callbackA)
{
    return gulp.series(myFirstTask, mySeccondTask, (callbackB) =>
    {
        callbackA();
        callbackB();
    })();    
}

2

আপনি এখানে যান: কোনও সিঙ্ক্রোনাস কাজ নেই

কোনও সুসংগত কাজ নেই

সিঙ্ক্রোনাস টাস্কগুলি আর সমর্থিত নয়। এগুলি প্রায়শই সূক্ষ্ম ভুলগুলির দিকে পরিচালিত করে যেগুলি ডিবাগ করা শক্ত ছিল, যেমন কোনও কাজ থেকে আপনার স্ট্রিমগুলি ফিরিয়ে দেওয়া ভুলে যাওয়া।

আপনি যখন Did you forget to signal async completion?সতর্কতাটি দেখেন , উপরে উল্লিখিত কোনও কৌশল ব্যবহার করা হয়নি। সমস্যাটি সমাধান করার জন্য আপনাকে ত্রুটি-প্রথম কলব্যাক ব্যবহার করতে হবে বা প্রবাহ, প্রতিশ্রুতি, ইভেন্ট প্রেরক, শিশু প্রক্রিয়া বা পর্যবেক্ষণযোগ্য ফিরিয়ে আনতে হবে।

ব্যবহার async/await

পূর্ববর্তী কোনও বিকল্প ব্যবহার না করার সময়, আপনি আপনার async functionটাস্কটিকে একটি হিসাবে সংজ্ঞায়িত করতে পারেন , যা আপনার কার্যকে একটি প্রতিশ্রুতি দিয়ে আবৃত করে । এটি আপনাকে সমকালীনভাবে awaitঅন্যান্য সিঙ্ক্রোনাস কোড ব্যবহার করে এবং প্রতিশ্রুতি দিয়ে কাজ করতে দেয় ।

const fs = require('fs');

async function asyncAwaitTask() {
  const { version } = fs.readFileSync('package.json');
  console.log(version);
  await Promise.resolve('some result');
}

exports.default = asyncAwaitTask;

2

মূলত v3.X সহজ ছিল তবে সিঙ্ক্রোনাস ও অ্যাসিঙ্ক্রোনাস কার্যগুলির ক্ষেত্রে v4.x কঠোর।

ASYNC / অপেক্ষায় রয়েছেন বেশ সহজ ও কর্মপ্রবাহ & ইস্যু বুঝতে সহায়ক উপায়।

এই সহজ পদ্ধতির ব্যবহার করুন

const gulp = require('gulp')

gulp.task('message',async function(){
return console.log('Gulp is running...')
})

1

আমি সম্প্রতি এটির সাথে লড়াই করে যাচ্ছিলাম এবং তখনকার মতো defaultটাস্ক তৈরির সঠিক উপায়টি খুঁজে পেয়েছি :sasssass:watch

gulp.task('default', gulp.series('sass', 'sass:watch'));

1

আমার সমাধান: সমস্ত কিছু async দিয়ে রাখুন এবং ঝাঁকুনির জন্য অপেক্ষা করুন।

async function min_css() {
    return await gulp
        .src(cssFiles, { base: "." })
        .pipe(concat(cssOutput))
        .pipe(cssmin())
        .pipe(gulp.dest("."));
}

async function min_js() {
    return await gulp
        .src(jsFiles, { base: "." })
        .pipe(concat(jsOutput))
        .pipe(uglify())
        .pipe(gulp.dest("."));  
}

const min = async () => await gulp.series(min_css, min_js);

exports.min = min;

0

ডিফল্ট ফাংশনে একটি প্যারামিটার হিসাবে সম্পন্ন করুন। তা করতে হবে.


0

যারা সো্যাগার স্থানীয় স্থাপনার জন্য কুঁচি ব্যবহার করার চেষ্টা করছেন তাদের জন্য নিম্নলিখিত কোডটি সহায়তা করবে

var gulp = require("gulp");
var yaml = require("js-yaml");
var path = require("path");
var fs = require("fs");

//Converts yaml to json
gulp.task("swagger", done => {
    var doc = yaml.safeLoad(fs.readFileSync(path.join(__dirname,"api/swagger/swagger.yaml")));
    fs.writeFileSync(
        path.join(__dirname,"../yourjsonfile.json"),
        JSON.stringify(doc, null, " ")
        );
    done();
});

//Watches for changes    
gulp.task('watch', function() {
  gulp.watch('api/swagger/swagger.yaml', gulp.series('swagger'));  
});

0

আমার কাছে বিষয়টি আলাদা ছিল: কৌণিক-ক্লিটি ইনস্টল করা হয়নি (আমি এনভিএম ব্যবহার করে একটি নতুন নোড সংস্করণ ইনস্টল করেছি এবং কৌনিক ক্লাইটি পুনরায় ইনস্টল করতে ভুলে গেছি)

আপনি "এনজি সংস্করণ" চলমান পরীক্ষা করতে পারেন।

আপনার যদি এটি না থাকে তবে কেবল "এনপিএম ইনস্টল -g @ কৌনিক / ক্লিপ" চালান


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