我有以下gulpfile.js,我通过命令行" gulp message"执行:
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?
我在Windows 10系统上使用gulp 4。这是gulp --version的输出:
[14:15:15] CLI version 0.4.0
[14:15:15] Local version 4.0.0-alpha.2
答案 0 :(得分:304)
由于您的任务可能包含异步代码,因此您必须在任务执行完毕后发出gulp信号(=" async completion")。
在Gulp 3.x中,你可以在不这样做的情况下离开。如果你没有明确表示异步完成gulp会假设你的任务是同步的,并且一旦你的任务函数返回它就会完成。 Gulp 4.x在这方面更加严格。您必须明确表示任务完成。
您可以在six ways中执行此操作:
如果您只是尝试打印某些内容,这不是一个真正的选项,但它可能是最常用的异步完成机制,因为您通常使用gulp流。这是一个(相当人为的)示例,用于说明您的用例:
var print = require('gulp-print');
gulp.task('message', function() {
return gulp.src('package.json')
.pipe(print(function() { return 'HTTP Server Started'; }));
});
这里重要的部分是return
声明。如果您不返回流,gulp无法确定流何时完成。
Promise
这是一个更适合您的用例的机制。请注意,大多数情况下您不必自己创建Promise
对象,它通常由包提供(例如,经常使用的del
包返回Promise
)。
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
使用async/await语法可以进一步简化。标记为async
的所有函数都隐式返回Promise,因此以下内容也有效(如果您的node.js version supports it):
gulp.task('message', async function() {
console.log("HTTP Server Started");
});
对于您的用例,这可能是最简单的方法:gulp会自动将回调函数作为其第一个参数传递给您的任务。只需在完成后调用该功能:
gulp.task('message', function(done) {
console.log("HTTP Server Started");
done();
});
如果您必须直接调用命令行工具,这是非常有用的,因为没有node.js包装器可用。它适用于您的用例,但显然我不推荐它(特别是因为它不是非常便携):
var spawn = require('child_process').spawn;
gulp.task('message', function() {
return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});
Observable
。我从未使用过这种机制,但如果您使用RxJS,它可能会有用。如果你只想打印一些东西,那就太过分了:
var of = require('rxjs').of;
gulp.task('message', function() {
var o = of('HTTP Server Started');
o.subscribe(function(msg) { console.log(msg); });
return o;
});
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;
});
答案 1 :(得分:29)
Gulp 4的问题-您需要明确地发信号通知任务完成以实现每个功能。>
要解决此问题,请尝试更改当前代码:
gulp.task('simpleTaskName', function() {
// code...
});
例如:
gulp.task('simpleTaskName', done => {
// code...
done();
});
答案 2 :(得分:10)
这行得通!
gulp.task('script', done => {
// ... code gulp.src( ... )
done();
});
gulp.task('css', done => {
// ... code gulp.src( ... )
done();
});
gulp.task('default', gulp.parallel(
'script',
'css'
)
);
答案 3 :(得分:10)
从gulp第3版迁移到第4版时,这是一个问题。只需将完成的参数添加到回调函数中,请参见示例
const gulp = require("gulp")
gulp.task("message", function(done) {
console.log("Gulp is running...")
done()
});
答案 4 :(得分:8)
您需要做一件事:
async
。
const gulp = require('gulp');
gulp.task('message', async function() {
console.log("Gulp is running...");
});
答案 5 :(得分:4)
解决方法:我们需要调用回调函数(Task和Anonymous):
function electronTask(callbackA)
{
return gulp.series(myFirstTask, mySeccondTask, (callbackB) =>
{
callbackA();
callbackB();
})();
}
答案 6 :(得分:3)
尝试运行非常简单的SASS / CSS构建时,我遇到了同样的错误。
我的解决方案(可能会解决相同或相似的错误)只是在默认任务功能中添加“完成”作为参数,并在默认任务结束时调用它:
#!/usr/bin/env python3
# countasync.py
import asyncio
async def count():
print("One")
await asyncio.sleep(1)
print("Two")
async def main():
await asyncio.gather(count(), count(), count())
if __name__ == "__main__":
import time
s = time.perf_counter()
asyncio.run(main())
elapsed = time.perf_counter() - s
print(f"{__file__} executed in {elapsed:0.2f} seconds.")
希望这会有所帮助!
答案 7 :(得分:2)
您需要做两件事;
从return开始功能
var gulp = require('gulp');
gulp.task('message', async function() {
return console.log("HTTP Server Started");
});
答案 8 :(得分:2)
我的解决方案:将所有内容放入异步并等待gulp。
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;
答案 9 :(得分:1)
我不能声称自己对此有很深的了解,但是我有同样的问题并已解决。 通过使用异步功能,可以解决第七种问题。
编写函数,但添加前缀 async 。
这样,Gulp会将函数包装在一个Promise中,任务将无错误运行。
示例:
async function() {
// do something
};
资源:
在gulp页面上的最后一部分“异步完成”,此处为“使用异步/等待”:
https://gulpjs.com/docs/en/getting-started/async-completion
Mozilla异步函数文档在这里:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
答案 10 :(得分:0)
添加完成作为默认功能中的参数。会的。
答案 11 :(得分:0)
对于那些试图使用gulp进行本地部署的用户,以下代码将有所帮助
<!--[if !IE]>-->
<script src="script.js"></script>
<!--<![endif]-->
答案 12 :(得分:0)
您在这里:
https://gulpjs.com/docs/en/getting-started/async-completion#no-synchronous-tasks
没有同步任务 不再支持同步任务。它们通常会导致难以调试的细微错误,例如忘记从任务中返回流。
当您看到“您是否忘记了异步完成信号?”警告,没有使用上述任何技术。您需要使用错误优先回调或返回流,promise,事件发射器,子进程或可观察对象来解决该问题。
使用异步/等待 当不使用任何先前的选项时,可以将任务定义为异步函数,该函数将任务包装在Promise中。这使您可以使用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;
答案 13 :(得分:0)
基本上,v3.X较为简单,但v4.x在同步和异步任务的这些方式上都非常严格。
异步/等待是了解工作流和问题的非常简单且实用的方法。
使用这种简单的方法
const gulp = require('gulp')
gulp.task('message',async function(){
return console.log('Gulp is running...')
})
答案 14 :(得分:0)
我最近在为此苦苦挣扎,发现创建运行$sql = "SELECT ban_id, timestamp, perp_steamid, perp_name, admin_steamid, admin_name, bantime, timeleft, reason FROM nomercyg_CTBan_Log";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo "<tr><td>". $row["ban_id"]. "</td><td>". date('m/d/Y h:i:s', $row["timestamp"]). "</td><td>". $row["perp_name"]. "</td><td>". $row["admin_name"]."</td><td>". $row["bantime"]." min". "</td><td>". $row["timeleft"]." min"."</td><td>". $row["reason"]. "</td></tr>";
}
echo "</table>";
} else {
echo "0 results";
}
然后default
的{{1}}任务的正确方法是:
sass
答案 15 :(得分:0)
对我来说,问题有所不同:未安装Angular-cli (我使用NVM安装了新的Node版本,只是忘记了重新安装angular cli)
您可以检查正在运行的“ ng版本”。
如果没有,只需运行“ npm install -g @ angular / cli”