Проблема JavaScript с примером цепочки обещаний - PullRequest
0 голосов
/ 02 февраля 2019

Мне трудно разобраться в связях обещаний в javaScript, поэтому я решил сделать пример и попрактиковаться в некотором коде, это то, что я хочу сделать ...

  • Выполнить "тяжелую задачу"в течение 5 секунд
  • Выполнить «среднюю задачу» в течение 3 секунд после успешного завершения тяжелой задачи
  • Если «средняя задача» успешна для «малой» задачи в 2 секунды
  • «Небольшая задача» должна отображать сообщение об успешном выполнении тяжелой задачи.
  • Если «средняя задача» не выполняется, выполнить «задачу ошибки» в течение 1 секунды с указанием причины сбоя
  • , пока все онипродолжаю делать "Некоторые другие задачи ..."

var p = new Promise(function(resolve, request) {

  setTimeout(function() {
   console.log("Inside heavy task...");
   resolve("Heavy task was a success");
  }, 5000);
 })


 .then(function(value) {

  setTimeout(function(value) {
   console.log("Inside medium task...");
   resolve(value);
   //reject("Medium task failed !");
  }, 3000);
 })

 .then(function(value) {

  console.log("Inside small task...");
  console.log("From small task : " + value);
 })

 .catch( function(reson){
  
  setTimeout(function(reason){
  console.log("Inside error task...");
  console.log("Failed due to "+reason);
  },1000);
 });

console.log("Some other tasks...");

Я понимаю, что мой код неверен, может кто-то исправить это и объяснить, как это должно быть сделано.

1 Ответ

0 голосов
/ 02 февраля 2019

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

setTimeout(callback, time, param1, param2, ...)

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

var p = new Promise(function(resolve, reject) {
  setTimeout(function() {
   console.log("Inside heavy task...");
   resolve("Heavy task was a success");
  }, 5000);
})
  .then(function(value) {
    var p2 = new Promise(function(resolve, reject) {
      setTimeout(function() {
        console.log("Inside medium task...");
        resolve(value);
        // reject("Medium task failed !");
      }, 3000);
    });
    return p2;
  })
  .then(function(value) {
    console.log("Inside small task...");
    console.log("From small task : " + value);
  })
  .catch(function(reason) {
    setTimeout(function(){
      console.log("Inside error task...");
      console.log("Failed due to "+ reason);
    }, 1000);
  });

console.log("Some other tasks...");

Надеюсь, это полезно:)

...