Javascript 如何强制gulp任务等待本地函数从HTTP请求返回其结果?
这应该不太难处理,我需要一个常规回调方法来停止它正在执行的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.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) {
});