2016-07-18 13 views
0

私はいくつかの既存のコードをさらに約束して拡張しようとしていますが、現時点で私にとっては新しい話題です。これはnpmのビルドスクリプトの一部として実行されています。約束を得ることができず、その後の約束が呼び出されない

私は現在、最終的に各パックの操作が各アーキテクチャで行われた後に呼び出されるようにしようとしています。私は

return new Promise 

しかし、私は最後に解決呼び出しに含めるべきかわからないので、私は、その関数から何かを返すわけではない現時点では、それを包む試してみました。本当に何も起こらずに解決策を呼び出すだけで、それを約束してラップすると、関数は実際には実行されず、どこにもエラーがキャッチされないようです。

私はこれについて完全に間違っていると思っています。達成したいのは、以前のものが完了したら別の機能を実行することです。

ここにコードがあります。それは、私が呼び出すことができない追加のものです。

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); 
} 
+0

'cfg'は、未定義の変数がここにある' .then(()= >ビルド(cfg)) 'と厳密なモードで拒否を引き起こす必要があります。それは 'then((cfg)=> build(cfg)')でなければなりません。それは意味があるかもしれないし、意味を持たないかもしれません。 'webpack'がそれ自身の結果で2回呼び出されることになっているともう一つの質問です。 – estus

+0

すばやい返信をありがとう、cfgはファイルの上に定義されています。これは正しく実行されているので、私は何が起こることができないのですか? –

+0

このコードで何も問題はありません。 2番目の '.then'は非同期(約束を返さない)ではないので、書かれているようにこのコードを拡張するために別の' .then 'は必要ありません。あなたの前提を再確認することをお勧めします。 – jib

答えて

0

あなたはlogが何であるかを言わなかったが、それは、プレーンロギング機能だ場合は、undefinedlog(...)の呼び出しからの結果)を渡しているよう、それはpackからcb引数として見えます。おそらく、あなたは:

いずれにしても、これは完了するのを待つために何もしません。なぜコンソール出力が表示されないのか分かりませんが、すべてのパッキングが完了した後にこの出力が発生することを望んでいる場合は、packagerを約束する必要があります。何かのように:

var pack = (plat, arch) => new Promise(resolve => { 
    // ... 
    packager(opts, resolve); 
}); 

と(それがOKかどう並行して)、すべての梱包を行う代わりにforEachPromise.allを使用します。

.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)); 
関連する問題