2015-04-18 13 views
11

Là một phần của một chương trình nhỏ tôi đang viết, tôi muốn sử dụng gulp để chuyển đổi một tập hợp lớn các tệp để đánh dấu. Đây không phải là một phần của bước xây dựng riêng biệt với chương trình. Đó là một phần của chương trình. Vì vậy, tôi không sử dụng một gulpfile để xử lý này.Làm cách nào để tôi có thể sử dụng gulp một lần trong ứng dụng của mình?

Vấn đề là, vì nó không đồng bộ, tôi muốn sử dụng lời hứa sẽ thông báo cho tôi khi nhiệm vụ gulp kết thúc.

Something như thế này sẽ là lý tưởng:

io.convertSrc = function() { 
    var def = q.defer(); 

    gulp.src(src + '/*.md') 
    .pipe(marked({})) 
    .pipe(gulp.dest(dist), function() { 
     def.resolve('We are done!'); 
    }); 

    return def.promise; 
} 

Nhưng pipe không mất một callback. Làm thế nào tôi có thể xử lý này? Cảm ơn sự giúp đỡ của bạn, tôi hơi mới để nuốt chửng.

Trả lời

14

Mọi thứ trong ngụm là một dòng suối, vì vậy bạn chỉ có thể nghe cho enderror sự kiện.

io.convertSrc = function() { 
    var def = q.defer(); 
    gulp.src(src + '/*.md') 
    .pipe(marked({})) 
    .pipe(gulp.dest(dist)) 
    .on('end', function() { 
     def.resolve(); 
    }) 
    .on('error', def.reject); 
    return def.promise; 
} 

Là một sang một bên, Q 1.0 không còn được phát triển (ngoại trừ một vài sửa lỗi ở đây và ở đó) và sẽ hoàn toàn tương thích với Q 2,0; Tôi muốn giới thiệu Bluebird làm phương án thay thế.

Cũng đáng nói đến là NodeJS 0.12 trở đi có những lời hứa ES6 xây dựng vào nó (không --harmony cờ cần thiết) vì vậy nếu bạn không tìm kiếm khả năng tương thích ngược bạn chỉ có thể sử dụng chúng thay vì ..

io.convertSrc = function() { 
    return new Promise(function(resolve, reject) { 
    gulp.src(src + '/*.md') 
     .pipe(marked({})) 
     .pipe(gulp.dest(dist)) 
     .on('end', resolve) 
     .on('error', reject); 
    }); 
}; 
+0

Ah! Vâng! Nên đã nhận ra điều đó! Cảm ơn bạn! –

+1

Ngoài ra, tôi không có đầu mối về sự hỗ trợ lời hứa ES6 trong Node. Thật là điên rồ/tuyệt vời. –

+1

Tôi chỉ phát hiện ra sáng nay khi lời kêu gọi "lời hứa mới" của tôi hoạt động mà không cần cài đặt Bluebird. Tôi đã rất bối rối một lúc. –

2

Kể từ khi nhiệm vụ Gulp là một dòng suối, bạn có thể nghe cho các sự kiện của nó:

io.convertSrc = function() { 
    var def = q.defer(); 

    var stream = gulp.src(src + '/*.md') 
    .pipe(marked({})) 
    .pipe(gulp.dest(dist)); 

    stream.on('end', function() { 
    def.resolve(); 
    }); 

    stream.on('error', function(err) { 
    def.reject(err); 
    }); 

    return def.promise; 
}; 
Các vấn đề liên quan