Как я могу разорвать свою цепочку обещаний в определенных случаях отклонения - PullRequest
0 голосов
/ 17 декабря 2018

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

Мой код выглядит следующим образом

await req.reduce((promise, audit) => {
    let globalData;
  return promise.then(_ => this.add(audit)
      .then((data)=> {
                          globalData = data; console.log('1'); 
                          return dropbox_functions.createFolder(data.ui, data)
                     }, 
           (error)=> {
                          failed.push({audit: audit, error: 'There was an error adding this case to the database'}); 
                          console.log('1.1'); i = i + 1; socket.emit('bulkAddUpdate', i/arrLen); 
                          throw new Error('There was an error adding this case to the database');
                     })
       .then((data)=>{
                         console.log('2');
                         return dropbox_functions.checkScannerFolderExists(audit.scanner_ui)
                     },
            (error)=>{
                         console.log('2.1');issues.push({audit: globalData, error: 'There was an error creating the case folder in dropbox'}); 
                         i = i + 1;socket.emit('bulkAddUpdate', i/arrLen); 
                         throw new Error('There was an error creating the case folder in dropbox');
                     })
       .then((data)=>{
                         console.log('3');
                         return dropbox_functions.moveFolder(audit.scanner_ui, globalData.ui)},
            (error)=>{
                         console.log('3.1');issues.push({audit: globalData, error: 'No data folder was found so an empty one was created'}); 
                         return dropbox_functions.createDataFolder(globalData.ui)
                     })
       .then(()=>    {
                         console.log('4');
                         success.push({audit:globalData}); 
                         i = i + 1;socket.emit('bulkAddUpdate', i/arrLen);},
          (error)=> {
                         issues.push({audit: globalData, error: 'Scanner folder found but items not moved'});console.log('4.1');
                    })
      .catch(function(error){
              console.log(error)
            })
    );
  }, Promise.resolve()).catch(error => {console.log(error)});

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

1 Ответ

0 голосов
/ 17 декабря 2018

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

Сохраняйте все свои «фатальные» ошибки на верхнем уровне и вкладывайте нефатальные ошибки взатем заблокировать.Я также предлагаю никогда с использованием формата "then (fn, fn)" - всегда указывайте явно свои уловы.

Пример:

return fnA().then(dataA => {
    return fnB(dataA).catch(error => {
        console.log("fnB got a non-fatal error, I'm fixing it.");
        return fnFixB();
    });
})
.then(dataB => fnC())
.then(dataC => {
    return fnD(dataC).catch(error => {
        console.log("fnD didn't work, I'm fixing it.");
        return fnFixD();
    });
}).catch(error => {
    console.log("Sorry: one of fnA, fnFixB, fnC, or fnFixD must have broken.");
});

В этом примере, еслиfnA или fnC отклонить, вы опускаетесь на дно;но fnB и fnD приводят к ошибкам, которые вы потенциально можете исправить (хотя, если ваши исправления fnFixB и fnFixD не удастся, вы тоже упадете).

Также,Я бы посоветовал разбить ваш код на более мелкие методы для удобства чтения: прочитайте статью Обработка ошибок в длинных цепочках Promise , чтобы найти отличный пример, очень похожий на ваш.

...