稍后在链中使用来自 promise 的响应

using response from promise later on in chain

我已经承诺链,第一个链中的响应应该稍后在链中(在 4 和 6)处使用,我使用一些全局变量来处理它,但这不是正确的方法,那里是实现这一承诺的更好方法吗?

这是对问题的一些说明...

var step1 = (ms) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("This is step 1");
      resolve(20);
    }, ms);
  })
}
var step2 = (ms) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("This is step 2");
      resolve();
    }, ms);
  })
};
var step3 = (ms) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("This is step 3");
      resolve();
    }, ms);
  })
};

var step4 = (ms) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("Step 4, run : " + ms );
      resolve();
    }, ms);
  })
};


var globalVar = null;

//Promise chain
step1(500)
  .then((res) => {
     //Here I keep the response in global variable to use later on
     globalVar = res;
    log(res);
    return step2(300);
  }).then(() => {
    return step3(200);
  }).then(() =>{
   //Here I need to use the res from the first promise
    var lclvar = globalVar +200 ;
    return step4(lclvar);
  }).catch((err) => {
  log(err);
});

我找到了这个,但这在这种情况下没有帮助(至少无法处理)

您可以将 step2step3 等调用嵌套在第一个处理程序中,然后 res 将对它们全部可用

step1(500).then((res) => {
  log(res);
  return step2(300)
    .then(() => step3(200))
    .then(() => step4(res + 200));
}).catch((err) => {
  log(err);
});

如果你真的想链接这个其实的话。这个想法是一个总线参数,沿着 way.It 在第一个 promise 中作为闭包创建。

你可以运行这个代码:

log=console.log
var step1 = (ms) => {
var Buss={p1:20};   
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("This is step 1");
      resolve(Buss);
    }, ms);
  })
}
var step2 = (ms,bus) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("This is step 2");
      resolve(bus);
    }, ms);
  })
};
var step3 = (ms,bus) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("This is step 3");
      resolve(bus);
    }, ms);
  })
};

var step4 = (bus) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("Step 4, run : " + bus.p1 );
      log("bus arrives:",bus);
      resolve(bus);
    }, bus.p1);
  })
};




//Promise chain
step1(500)
  .then((res) => {
     //Here I keep the response in global variable to use later on
     //globalVar = res;
    log(res);
    return step2(300,res);
  }).then((res) => {
    return step3(200,res);
  }).then((res) =>{
   //Here I need to use the res from the first promise
    //var lclvar = globalVar +200 ;
    res.p1+=200;
    return step4(res);
  }).catch((err) => {
  log(err);
});