2015-03-27 22 views
22

Một nhiệm vụ trong ngụm thể được định nghĩa như sau:gulp: chức năng gọi lại nhiệm vụ gulp được định nghĩa ở đâu?

gulp.task('foobar', function(callback) { ... }); 

Tôi đang cố gắng để hiểu những gì các hàm callback là. Nó được định nghĩa ở đâu? Tôi có thể vượt qua trong một số chức năng khác như một đối số trong thời gian chạy không? Nó làm gì?

These docs cho biết đối số gọi lại là gợi ý cho Người phối hợp rằng tác vụ sẽ được chạy không đồng bộ, nơi thực thi cuộc gọi lại cho biết rằng tác vụ async đã hoàn tất.

Với một số thí nghiệm có vẻ như cách gọi callback không có đối số trả về một nhà nước thành công, và gọi đó là với một số chuỗi ném một lỗi:

gulp.task('foobar', function(callback) { 
    callback(); 
}); 

gulp.task('bazkad', function(callback) { 
    callback("some string"); 
}); 

(dành: làm thế nào để tôi đặt một break giữa khối mã ? trong StackOverflow markdown)

$ gulp foobar 
[09:59:54] Using gulpfile ~\repos\gulpproj\gulpfile.js 
[09:59:54] Starting 'foobar'... 
[09:59:54] Finished 'foobar' after 56 μs 
$ gulp bazkad 
[10:05:49] Using gulpfile ~\repos\gulpproj\gulpfile.js 
[10:05:49] Starting 'bazkad'... 
[10:05:49] 'bazkad' errored after 55 μs 
[10:05:49] Error: some string 
    at formatError (~\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:169:10) 
    at Gulp.<anonymous> (~\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:195:15) 
    at Gulp.emit (events.js:107:17) 
    at Gulp.Orchestrator._emitTaskDone (~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\index.js:264:8) 
    at ~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\index.js:275:23 
    at finish (~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:21:8) 
    at cb (~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:29:3) 
    at Gulp.<anonymous> (~\repos\gulpproj\gulpfile.js:35:5) 
    at module.exports (~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:34:7) 
    at Gulp.Orchestrator._runTask (~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\index.js:273:3) 

Vì vậy, câu hỏi tôi đã bao gồm:

  • Is đây là chức năng duy nhất của cuộc gọi lại, để đưa ra một ngoại lệ nếu thông qua một đối số và để hoàn thành thành công nếu không, hay nó làm điều gì đó khác?
  • Tôi có thể ghi đè nó bằng một số chức năng khác (và sẽ có bất kỳ lý do lành mạnh nào để làm như vậy) không?

Có thể kỹ năng đọc tài liệu của tôi không thành công (không phải là lần đầu tiên), nhưng dường như tôi không tìm thấy câu trả lời cho các câu hỏi này trong tài liệu API.

Cảm ơn bạn đã được trợ giúp.

+0

Bạn nên tóm tắt bài đăng của mình để chỉ hỏi một câu hỏi, còn tiêu đề của bạn không khớp với câu hỏi của bạn. Ý của bạn là gì? –

+0

Tôi đã xóa một câu hỏi có chủ đề nhỏ nhưng phần còn lại của câu hỏi được liên kết khá chặt chẽ. Theo như tôi hiểu nó, tiêu đề phù hợp với những điều này tốt. Có lẽ khi tôi nhìn thấy một câu trả lời tôi sẽ hiểu rằng nó không phải là một trận đấu tốt. – laffoyb

+0

Bởi "một break giữa các khối mã" Tôi có nghĩa là tôi đã có hai khối mã đã được phân biệt một cách hợp lý (một từ một tập tin nguồn, một từ dòng lệnh IO) mà tôi muốn đặt cạnh nhau nhưng với một break từ làm nổi bật khối mã để cho biết rằng chúng không phải là tất cả các phần của cùng một tệp. Tôi nghĩ rằng điều này được gọi là "hàng rào" ở một số khu vực? – laffoyb

Trả lời

32

Chức năng gọi lại đến từ dàn nhạc (hoặc người thực hiện mới - trong Gulp 4) và thực sự không có gì khác ngoài lời gọi để báo cho hệ thống nhiệm vụ rằng nhiệm vụ của bạn đã được thực hiện. Đó là lý do tại sao họ thay đổi nó thành

gulp.task('something', function(done) { ... }); 

Trong tài liệu sắp tới để làm rõ hơn điểm đó.

Tại sao bạn cần gọi lại? Thông thường, bạn trả lại luồng khi xác định một tác vụ:

gulp.task('goodstuff', function() { 
    return gulp.src('./app/**/*.*') 
     .pipe(someotherstuff()) 
     .pipe(gulp.dest('./dist'); 
}); 

Bằng cách trả lại luồng, hệ thống nhiệm vụ có thể lập kế hoạch thực hiện các luồng đó. Nhưng đôi khi, đặc biệt khi bạn đang ở địa ngục gọi lại hoặc gọi một số plugin không có luồng, bạn không thể trả lại luồng. Đó là những gì gọi lại cho. Để cho hệ thống nhiệm vụ biết rằng bạn đã hoàn thành và chuyển sang cuộc gọi tiếp theo trong chuỗi thực hiện.

Để câu hỏi của bạn:

Is this the only functionality of the callback, to raise an exception if passed an argument and to complete successfully otherwise?

Không, các chức năng duy nhất là để cho các hệ thống nhiệm vụ biết rằng nhiệm vụ của bạn được thực hiện.

Is there anything else that it does?

số

Could I override it with some other function (and would there be any sane reason to do so)?

Không và số

Is it possible to pass any other arguments to a gulp task function?

Không, nhưng tại sao bạn? Bạn có toàn bộ phạm vi của một tệp JS trên dịch vụ của bạn, chỉ cần đặt các đối số của bạn ở đâu đó xung quanh.

+0

Vì vậy, nếu tôi hiểu chính xác, cách thành ngữ để chuyển đối số cho các tác vụ gulp là bằng cách thay đổi cấu hình chung? – laffoyb

+1

Vâng, đó là JavaScript ... bạn có một số khả năng khác. Nhưng gói gọn: Vâng, đó sẽ là trường hợp phổ biến (và có, đây cũng là một trong những lỗi của Gulp). – ddprrt

+0

Tôi e rằng tôi chỉ mới bắt đầu sử dụng JavaScript và NodeJS một cách nghiêm túc trong thời gian gần đây, vì vậy tôi không nghĩ rằng tôi biết các khả năng khác. – laffoyb

Các vấn đề liên quan