Javascript 如何强制gulp任务等待本地函数从HTTP请求返回其结果?

Javascript 如何强制gulp任务等待本地函数从HTTP请求返回其结果?,javascript,gulp,Javascript,Gulp,这应该不太难处理,我需要一个常规回调方法来停止它正在执行的gulp任务,因为它在其中执行http请求 gulp.task('html', function() { var params = { apiKey: '*****', spaceId: '******', opts:{ filter: '*****', level: 3 } }; return $.remoteSrc(languages, { base: 'http

这应该不太难处理,我需要一个常规回调方法来停止它正在执行的gulp任务,因为它在其中执行http请求

gulp.task('html', function() {
var params = {
    apiKey: '*****',
    spaceId: '******',
    opts:{
        filter: '*****',
        level: 3
    }
};
return $.remoteSrc(languages, {
    base: 'https://api',
    qs: {
        index: 'id',
        fallback: 'en',
        key: '****'
    }
})
    .on('error', onError)
//here the following function should wait for the result from the   secondFunction, which is only avaible after the gulp task finishes execution
    .pipe($.foreach(function(stream, file) {
        var data = JSON.parse(String(file.contents));
        data.lang = file.path.match(/([^\/]+)(?=\.\w+$)/)[0];
        params.locale = _.keys( _.pick(languageKeys, data.lang)) + _.values(_.pick(languageKeys, data.lang));
       result = secondFunction(params);


        return gulp.src(dist + '*.html')
            .pipe($.template(data)).on('error', onError)
            .pipe(gulp.dest(dist + path.basename(file.path, '.json')));
    }));
});

var secondFunction = function (params) {
    return  contentfulData (params,  function (err, result) {
        if(!err) {
            //do something
            console.log('first'+ result);
            // console.log(result);
            return result;
        }
    
    });
};

解决方案是使用承诺并将任务执行分为主任务和依赖性任务,问题是在将控制权传递给 管道($.template(数据))

在响应从API返回之前生成tempaltes,使用在合并内容和生成模板之前解析的承诺数组来解决它

    gulp.task('html',['contentful-faq'], function() {

    Promise.all(contentfulPromises).then(function (result) {
//did something with the result here      
            }
        }
    });

    return $.remoteSrc(languages, {
        base: 'https://API/PATH',
        qs: {
            index: 'id',
            fallback: 'en',
            key: 'abc123'
        }
    })
        .on('error', onError)
        .pipe($.foreach(function(stream, file) {
            var data = JSON.parse(String(file.contents));
            data.lang = file.path.match(/([^\/]+)(?=\.\w+$)/)[0];

            data.faq = _.merge(data.faq, contentfulResult[data.lang+languageKeys[data.lang]]);
            return gulp.src(dist + '*.html')
                .pipe($.template(data))
                .on('error', onError)
                .pipe($.if(isProduction, $.htmlmin({
                    collapseWhitespace: true,
                    conservativeCollapse: true,
                    removeComments: true,
                    useShortDoctype: true,
                    collapseBooleanAttributes: true,
                    removeRedundantAttributes: true,
                    removeEmptyAttributes: true,
                    minifyJS: true,
                    minifyCSS: true
                })))
                .pipe(gulp.dest(dist + path.basename(file.path, '.json')));
        }));
});

//Get faq from contenful
var contentfulPromises = [];
gulp.task('contentful-faq', function (cb) {
    var that = this;
    var params = {
        apiKey: 'xxxxxxxxx',
        spaceId: 'abc123',
        opts: {
            filter: 'abc123',
            level: 3,
            order: 'fields.order'
        }
    };
    var getContenful = function (params) {
        for (var lang in languageKeys) {
            params.locale = _.keys(_.pick(languageKeys, lang)) + _.values(_.pick(languageKeys, lang));
            contentfulPromises.push(new Promise(function (resolve, reject) {
                contentfulData(params, function (err, result) {
                    resolve(result);
                });
            }));
        }
        Promise.all(contentfulPromises)
            .then(function (results) {
            that.emit('end');
        })
            .then(function (err) {
                cb(err);
            });
    }(params);
}).on('end', function (results) {
});