首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使promises起作用,后续promises未被调用

无法使promises起作用,后续promises未被调用
EN

Stack Overflow用户
提问于 2016-07-19 00:29:58
回答 1查看 60关注 0票数 0

我正在尝试用额外的承诺来扩展一些现有的代码,但它们目前对我来说是一个新的话题,我显然遗漏了一些东西。这是作为npm的构建脚本的一部分运行的。

我现在所要做的就是在每个架构的打包操作完成后调用最终的结果。我尝试过将它包装在一个

代码语言:javascript
复制
return new Promise

但目前我没有从该函数返回任何内容,所以我不确定最后应该在resolve调用中包含什么内容。如果我只是使用true调用resolve,什么都不会发生,并且将它包装在promise中似乎会导致函数实际上不运行,并且在任何地方都没有捕获到错误?

我猜我这样做是完全错误的,我想要实现的是在前一个函数完成后再运行另一个函数?

下面是代码的原样,以及我无法调用的附加.then。

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2016-07-20 01:05:44

您没有说明log是什么,但是如果它是一个普通的日志函数,那么看起来就像是将undefined (调用log(...)的结果)作为cb参数传递给pack。也许你的意思是:

代码语言:javascript
复制
pack(plat, arch, () => log(plat, arch));

在任何情况下,这都不会做任何等待打包完成的事情。我不知道为什么您没有看到任何控制台输出,但是如果您希望在所有打包完成后出现此输出,那么您需要将packager包装在promise中。类似于:

代码语言:javascript
复制
var pack = (plat, arch) => new Promise(resolve => {
    // ...
    packager(opts, resolve);
});

然后使用Promise.all而不是forEach来完成所有的打包工作(如果可以的话,并行进行):

代码语言:javascript
复制
.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));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38441797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档