JavaScript回调函数..感到困惑

时间:2019-01-31 16:38:27

标签: javascript function callback gulp

我确定该问题的答案存在于某处,但不确定如何措辞该问题,并且在尝试研究回调时找不到所需的内容。

好吧,所以我刚刚开始涉猎Gulp来编译我的CSS,尽管它对JavaScript没用,但我认为它很棒!。

我的代码在下面,但是我不明白这些回调是如何工作的。如何将回调设置为参数,然后从函数内部调用?我不明白..该函数基本上是在期待什么吗?正在设置什么值或期望运行什么?我似乎无法理解。

我在JavaScript中经常看到这种情况,但是不确定它是如何工作的。我看过有关函数和回调的视频和教程,它们很有意义,但是我似乎永远找不到任何可以解释该概念的地方,这使我相信我没有在寻找正确的东西。

我也看到在Promises中设置了“ resolve”或“ reject”参数的情况,但是不确定满足条件时正在发生什么,或者设置了什么值以及在哪里设置..希望这有意义并感谢您对更好地理解这一点有所帮助。

const gulp = require('gulp');
const sass = require('gulp-sass');
const browserSync = require('browser-sync');


// TASKS
// Compile SASS
gulp.task('sass-compile', (callback) => {
    gulp.src('scss/*.scss')
    .pipe(sass().on('error', sass.logError))
    .pipe(gulp.dest('css'))
    .pipe(browserSync.stream());
    console.log('******************** SCSS > CSS successful ********************');
    callback();
});

// Live reload
gulp.task('browser-sync', (callback) => {  
    browserSync.init({
        proxy: 'http://localhost/test1',
        port: 80
    });
    callback();
});

// WATCHER
gulp.task('default', gulp.series('browser-sync', (callback) => {
    gulp.watch('scss/*.scss', gulp.series('sass-compile'));
    callback();
}));

2 个答案:

答案 0 :(得分:-1)

函数是一种对象。对象是一种值。

值可以存储在变量,对象属性中,并作为参数传递给函数。

所以:

这是一个简单的函数,称为。

function foo() {
  console.log("Foo");
}

foo();

这是一个简单的函数,复制到另一个变量中,称为该变量。

function foo() {
  console.log("Foo");
}

const bar = foo;

bar();

现在作为参数传递给另一个函数。

function foo() {
  console.log("Foo");
}

function other(bar) {
    bar();
}

other(foo);

相同,但参数传递给原始函数。

function foo(baz) {
  console.log("Foo: " + baz);
}

function other(bar) {
    const arg = "Bar";
    bar(arg);
}

other(foo);

您刚刚看过一些示例,其中负责调用回调的函数不是您编写的代码(并且您没有查看调用回调的函数的源代码)。

答案 1 :(得分:-1)

在javascript中,函数是一流的对象,这意味着它们可以传递给其他函数。在很多情况下都可以使用它,但是您所指的情况(gulp.task和新的Promise)实际上是在使用它在您的代码与其代码之间进行双向通信。当您使用gulp.task时,基本上会发生以下步骤

1)您调用gulp.task,说“我想做点工作”。您传入一个函数,说出您想做什么
2)在适当的时候,gulp.task调用您的函数,但将另一个函数传递给它,说“完成后,调用此函数以通知我”。

gulp.task的简化版本如下:

const task = (name, workToDo) => {
  const done = () => {
    console.log('task', name, 'has let me know its done');
  }
  
  console.log('ive been asked to start task', name);
  setTimeout(() => {
    console.log('500ms elapsed; starting task', name);
    workToDo(done);    
  }, 500);
}

task('sample', (done) => {
 console.log('doing work');
 setTimeout(() => {
   console.log('1 second has elapsed. calling back to let it know i am done');
   done();
 }, 1000)
});

promise的构造函数具有相似的目的。您说“我想使用下面的代码创建一个承诺”,然后它调用您的代码,并传入刚刚创建的两个函数(通常命名为resolvereject)。这些用于告诉诺言“我已成功完成”或“我做错了”,从而将诺言移至已解决状态或被拒绝状态。