2016-09-01 4 views
0

Я борюсь с обещаниямиNodejs Promise() ошибка глотания

, имеющий следующий фрагмент кода:

Promise.resolve() 
 
    .then(a("OK1")) 
 
    .then(a("OK2")) 
 
    .then(a("OK3")) 
 
    .then(a("OK4")) 
 
    .then(a("OK5")) 
 
    .then(function() { 
 
     console.log("FINISH"); 
 
    }) 
 
    .catch(function(e) { 
 
     
 
     console.log("ERROR: " + e); 
 
    }); 
 

 

 
function a(i) { 
 
    return new Promise(function(resolve, reject) { 
 
     
 
     if(i == "OK4") { 
 
      console.log("THROW"); 
 
      throw('Error'); //This does not happen 
 
      reject(); 
 
      return; 
 
     } 
 
     if(i == "OK2") { 
 
      reject() 
 
      return; 
 
     } 
 
     console.log(i); 
 
     resolve(); 
 
    }); 
 
}

я хочу, чтобы иметь возможность отклонить обещание - то следующий .then («OK3») , но я не могу исключить исключения - я хочу запустить .catch на «OK4»

OK4 - отклоняется и не выводится, но OK5 все еще выполняется - есть ли способ, чтобы он был вокруг?

это будет мой ожидаемый результат:

OK1 
OK3 
ERROR: .... 
+3

Вы должны передать функцию 'then', а не обещание. Вы выполняете все свои функции без каких-либо цепочки. – Bergi

+0

ok и как я могу решить проблему с помощью функции async? функция а (х) { SetTimeout (функция() {// КАК РЕШИТЬ ОТ ЗДЕСЬ }, 2000?); –

+0

Вам нужно обернуть его в вызов конструктора 'Promise', как и в вашем вопросе, так что' разрешение' доступно через закрытие. Не уверен, что я понимаю вопрос? – Bergi

ответ

1

Как уже упоминалось Берги, параметр вы передаете на каждом .then запускает функцию немедленно вернуть обещание. Цепочка обещаний нуждается в ссылке на функцию, которую он может запустить позднее.

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

a("OK1") 
    .then((res)=>{ 
    return a("OK2") 
    }) 
    .then((res)=>{ 
    return a("OK3") 
    }) 
    .then((res)=>{ 
    return a("OK4") 
    }) 
    .then((res)=>{ 
    return a("OK5") 
    }) 
    .then(()=>{ 
    console.log("FINISH"); 
    }) 
    .catch(function(e) { 
    console.log("ERROR: " + e); 
    }); 


function a (i) { 
    return new Promise(function(resolve, reject) { 

     if(i == "OK4") { 
      console.log("THROW"); 
      throw new Error(i); //This does not happen 
     } 
     if(i == "OK2") { 
      return reject(new Error(i)) 
     } 
     setTimeout(function() { 
      console.log(i); 
      resolve(i); 
     }, 100) 
    }); 
} 

Это нормально передать функцию, которая в конечном итоге вернет обещание. Функция будет передана значение, с которым было разрешено предыдущее обещание.

b(1) 
    .then(b) 
    .then(b) 
    .then(b) 
    .then((res) => { 
    console.log("FINISH",res); 
    }) 
    .catch(function (e) { 
    console.log("ERROR: " + e); 
    }); 

function b (i) { 
    return new Promise(function (resolve, reject) { 
    console.log(i) 
    resolve(i+1) 
    }) 
} 
+0

спасибо, что @Bergi упомянул, что главная проблема заключалась в том, что функция, переходящая к вариации Мэтта, сделала это. thx guys –

Смежные вопросы