2016-07-18 9 views
0

Ich versuche, bestehenden Code mit zusätzlichen Versprechungen zu erweitern, aber sie sind im Moment ein neues Thema für mich und ich vermisse offensichtlich etwas. Dies wird als Teil eines Build-Skripts für npm ausgeführt.Ich kann keine Versprechungen zur Arbeit bekommen, die folgenden Versprechen werden nicht genannt.

Alles, was ich gerade versuche, geschehen zu lassen, ist für das Finale dann aufgerufen werden, nachdem der Packvorgang für jede Architektur passiert ist. Ich habe versucht, es in einem

return new Promise 

Einwickeln Aber im Moment kann ich nichts von dieser Funktion zurückkehre, so dass ich nicht sicher bin, was ich in der Entschlossenheit Anruf am Ende enthalten soll. Wenn ich nur die Auflösung mit einem wahren Anruf nenne, passiert nichts, und wenn man es in ein Versprechen einpackt, scheint die Funktion tatsächlich nicht ausgeführt zu werden, und nirgends werden Fehler entdeckt.

Ich schätze, ich gehe völlig falsch, alles, was ich erreichen möchte, ist eine andere Funktion zu führen, sobald der vorherige abgeschlossen ist?

Hier ist der Code, wie es mit dem zusätzlichen steht., Dann kann ich nicht aufgerufen werden.

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' ist nicht definierte Variable hier' .then (() = > build (cfg)) 'und sollte im strikten Modus eine Ablehnung verursachen. Es sollte 'dann ((cfg) => build (cfg))' sein. Was vielleicht nicht sinnvoll ist oder nicht, ist eine andere Frage, ob "webpack" zweimal auf sein eigenes Ergebnis angesprochen werden soll. – estus

+0

Danke für die schnelle Antwort, cfg ist weiter oben in der Datei definiert, wie es hier ist, das läuft gut, was ich nicht passieren kann, ist die endgültige. Dann aufgerufen werden? –

+0

Ich sehe nichts falsch mit diesem Code. Das vorletzte '.then' ist nicht einmal asynchron (kein Versprechen), also braucht man nicht einmal ein' '' '' ''' ', um diesen Code zu erweitern, wie er geschrieben wurde (aber es sollte funktionieren). Ich schlage vor, Sie bestätigen Ihre Annahmen. – jib

Antwort

0

Sie nicht sagen, was log ist, aber wenn es eine einfache Logging-Funktion ist, es sieht dann aus wie Sie in undefined (das Ergebnis log(...) von Aufruf) vorbei sind zu pack als cb Argument. Vielleicht meintest du:

pack(plat, arch,() => log(plat, arch)); 

In jedem Fall wird dies nichts tun, um auf die Verpackung zu warten. Ich weiß nicht, warum Sie keine Konsole-Ausgabe sehen, aber wenn Sie nach dieser Ausgabe suchen, nachdem alle Verpackung abgeschlossen ist, dann müssen Sie packager in ein Versprechen verpacken. Etwas wie:

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

Und dann verwenden Promise.all statt forEach alle Bestandteile der Verpackung zu tun (parallel, wenn das OK ist):

.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));