2016-07-18 3 views
0

Я пытаюсь расширить существующий код с дополнительными обещаниями, но для меня это новая тема для меня в данный момент, и я, очевидно, что-то пропустил. Это выполняется как часть скрипта сборки для npm.Невозможно получить обещания работать, последующие обещания не называются

Все, что я в настоящее время пытаюсь сделать, это то, что финальный вызов будет вызван после того, как операция пакета произошла для каждой архитектуры. Я попытался окружив его

return new Promise 

Но на данный момент я не возвращающее ничего из этой функции, так что я не уверен, что я должен включить в Resolve вызова в конце. Если я просто вызываю решение с истинным, ничего не происходит, и, заверяя его в обещание, кажется, что функция фактически не запускается, и нигде не обнаруживаются ошибки?

Я предполагаю, что я собираюсь сделать это совершенно неправильно, все, что я хочу достичь, - запустить другую функцию после завершения предыдущего?

Вот код в том виде, как он стоит с дополнительным. То, что я не могу называться.

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 (() = > build (cfg)) 'и должен вызывать отклонение в строгом режиме. Это должно быть 'then ((cfg) => build (cfg))'. Что может или не имеет смысла, это еще один вопрос, если «webpack» должен быть вызван по собственному результату дважды. – estus

+0

Спасибо за быстрый ответ, cfg определяется дальше по файлу, так как он прямо здесь, это отлично работает, что я не могу сделать, это окончательный. Then to be called? –

+0

Я не вижу ничего плохого в этом коде. Второй, чтобы продолжить '.then' даже не асинхронный (не возвращая обещание), так что вам даже не понадобится другой' .then', чтобы продлить этот код, как написано (но он должен работать). Я предлагаю вам пересмотреть свои предположения. – jib

ответ

0

Вы не сказали, что log, но если это обычная функция протоколирования, то это выглядит, как вы передаете в undefined (результат от вызова log(...)) в качестве аргумента cbpack. Возможно, вы имели в виду:

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

В любом случае, это не принесет ничего, чтобы дождаться завершения упаковки. Я не знаю, почему вы не видите какой-либо выход на консоль, но если вы хотите, чтобы этот результат происходил после завершения упаковки, вам нужно обернуть packager в обещании. Что-то вроде:

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)); 
Смежные вопросы