我正在尝试用额外的承诺来扩展一些现有的代码,但它们目前对我来说是一个新的话题,我显然遗漏了一些东西。这是作为npm的构建脚本的一部分运行的。
我现在所要做的就是在每个架构的打包操作完成后调用最终的结果。我尝试过将它包装在一个
return new Promise但目前我没有从该函数返回任何内容,所以我不确定最后应该在resolve调用中包含什么内容。如果我只是使用true调用resolve,什么都不会发生,并且将它包装在promise中似乎会导致函数实际上不运行,并且在任何地方都没有捕获到错误?
我猜我这样做是完全错误的,我想要实现的是在前一个函数完成后再运行另一个函数?
下面是代码的原样,以及我无法调用的附加.then。
function build(cfg) {
return new Promise((resolve, reject) => {
webpack(cfg, (err, stats) => {
if (err) return reject(err);
resolve(stats);
});
});
}
function startPack() {
console.log('start pack...');
build(electronCfg)
.then(() => build(cfg))
.then(() => del('release'))
.then(paths => {
if (shouldBuildAll) {
// build for all platforms
const archs = ['ia32', 'x64'];
const platforms = ['linux', 'win32', 'darwin'];
platforms.forEach(plat => {
archs.forEach(arch => {
pack(plat, arch, log(plat, arch));
});
});
} else {
// build for current platform only
pack(os.platform(), os.arch(), log(os.platform(), os.arch()));
}
})
.then(() => {
console.log('then!');
})
.catch(err => {
console.error(err);
});
}
function pack(plat, arch, cb) {
// there is no darwin ia32 electron
if (plat === 'darwin' && arch === 'ia32') return;
const iconObj = {
icon: DEFAULT_OPTS.icon + (() => {
let extension = '.png';
if (plat === 'darwin') {
extension = '.icns';
} else if (plat === 'win32') {
extension = '.ico';
}
return extension;
})()
};
const opts = Object.assign({}, DEFAULT_OPTS, iconObj, {
platform: plat,
arch,
prune: true,
'app-version': pkg.version || DEFAULT_OPTS.version,
out: `release/${plat}-${arch}`,
'osx-sign': true
});
packager(opts, cb);
}发布于 2016-07-20 01:05:44
您没有说明log是什么,但是如果它是一个普通的日志函数,那么看起来就像是将undefined (调用log(...)的结果)作为cb参数传递给pack。也许你的意思是:
pack(plat, arch, () => log(plat, arch));在任何情况下,这都不会做任何等待打包完成的事情。我不知道为什么您没有看到任何控制台输出,但是如果您希望在所有打包完成后出现此输出,那么您需要将packager包装在promise中。类似于:
var pack = (plat, arch) => new Promise(resolve => {
// ...
packager(opts, resolve);
});然后使用Promise.all而不是forEach来完成所有的打包工作(如果可以的话,并行进行):
.then(paths => {
if (!shouldBuildAll) {
return pack(os.platform(), os.arch());
}
return Promise.all(['linux', 'win32', 'darwin'].map(plat =>
Promise.all(['ia32', 'x64'].map(arch => pack(plat, arch))));
})
.then(() => console.log('then!'))
.catch(err => console.error(err));https://stackoverflow.com/questions/38441797
复制相似问题