15

我正在尝试做这样的事情:

gulp.task("test", async () => {
    return gulp.src("**/*.scss")
        .pipe(print((filePath) => `File: ${filePath}`));
});

(打印是gulp-print

但它给出了以下内容:

[22:08:43] Starting 'test'...
[22:08:43] Finished 'test' after 12 ms
[22:08:43] File: src\app\styles\app.scss
[22:08:43] File: src\app\styles\test.scss

即它在打印消息之前完成。

我正在使用 Gulp 4(我认为是 alpha 2)和 TypeScript(1.8.0-dev.20151204)。

生成的 (ES6) 代码如下所示:

gulp.task("test", () => __awaiter(this, void 0, Promise, function* () {
    return gulp.src("**/*.scss")
        .pipe(print((filePath) => `File: ${filePath}`));
}));

在哪里__awaiter

var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promise, generator) {
    return new Promise(function (resolve, reject) {
        generator = generator.call(thisArg, _arguments);
        function cast(value) { return value instanceof Promise && value.constructor === Promise ? value : new Promise(function (resolve) { resolve(value); }); }
        function onfulfill(value) { try { step("next", value); } catch (e) { reject(e); } }
        function onreject(value) { try { step("throw", value); } catch (e) { reject(e); } }
        function step(verb, value) {
            var result = generator[verb](value);
            result.done ? resolve(result.value) : cast(result.value).then(onfulfill, onreject);
        }
        step("next", void 0);
    });
};

有可能让这个工作吗?我想await在我的任务函数中使用,但是如果不将该函数标记为异步,我就无法做到这一点。

我可能遗漏了一些明显的东西。

4

2 回答 2

19

我能够在herehere的帮助下完成这项工作。

gulp.task("test", async () => {
    await new Promise((resolve, reject) => {
        gulp.src("**/*.scss")
            .pipe(print((filePath) => `File: ${filePath}`))
            .on("end", resolve);
    });
});

在我的实际任务中,我不得不使用finish事件而不是end事件(参见上面的第二个链接)。

目前还不清楚这一切是如何运作的,但我认为这大致如下:

  1. Gulp 函数是异步的,因此需要等待它们,但由于它们不是 Promise,因此您必须将它们包装在一个中。
  2. 为了解决promise,你需要监听end或监听finish事件,哪个取决于最后一个管道返回的内容。

在通常需要的情况下,另一个似乎有效的选项resume()后面是 。这大概是因为这个。我不确定哪个选项更好。on("end")finish

我很想更多地理解这一点,所以如果您能够用简单的术语来解释这一点,请随时发表评论或发布答案。

编辑:您也可以返回承诺,而不是等待它。

于 2015-12-10T10:06:12.430 回答
2

基于@glen-84 的回答,我找到了我的解决方案,它并没有真正的不同,但也不相同。

不知何故,对于任务的正确答案,我在直接使用parallel/时遇到了一些问题series,再次导致did you signal async completion错误。可能是由我在代码中监督的错误引起的。

基于承办商自述文件中的此示例:

taker.task('task3', function(){
  return new Promise(function(resolve, reject){
    // do things

    resolve(); // when everything is done
  });
});

我使用了这种结构,它似乎适用于taskand series/ parallel

function someTask() {
    return new Promise(async (resolve, reject) => {
        await prepareSomethingAsync()
        gulp.src(somePath)
            .pipe(doingSomething())
            .pipe(await doingSomethingBasedOnAsyncResult())
            .on('finish', resolve)
            .on('error', reject)
    })
}

// e.g.: gulp.task('Some Name', someTask)

// e.g.: gulp.series(someTask)

// e.g.: gulp.parallel([someTask, someTask])
于 2021-09-12T23:01:45.350 回答