Javascript 如何恰当地构造带条件和延迟的获取承诺链?

Javascript 如何恰当地构造带条件和延迟的获取承诺链?,javascript,promise,fetch,Javascript,Promise,Fetch,如何合理地构造有条件、有延迟的取回承诺链?我有 fetch("/myApi") .then(response => response.json()) .then(json => { if (data.foo != "bar") return fetch("/setFoo=bar").then(() => delay(100).then(() => { if (data.

如何合理地构造有条件、有延迟的取回承诺链?我有

fetch("/myApi")
  .then(response => response.json())
  .then(json => {
    if (data.foo != "bar")
      return fetch("/setFoo=bar").then(() => delay(100).then(() => {
        if (data.magic != "exist")
          return fetch("/setMagic=exist")
      }))
    if (data.magic != "exist")
      return fetch("/setMagic=exist")
  })
  .then(() => console.log("Great success !"))

function delay(ms) { return new Promise((resolve, reject) => setTimeout(resolve, ms))}
此代码应发出API请求,检查foo值是否等于bar,如果不是,则设置
foo=bar
,然后等待100ms,如果未设置,则设置值
magic=exist

但如果
foo
已经是
bar
,则应立即将
magic
设置为
exist

在我的例子中,我复制了
magic=exist
检查并设置,结果看起来完全错误。

以下是您想要的:

fetch(“/myApi”)
.then(response=>response.json())
。然后(异步json=>{
如果(data.foo!=“bar”){
等待提取(“/setFoo=bar”);
等待延迟(100);
}
如果(data.magic!=“存在”)
返回fetch(“/setMagic=exist”)
})
。然后(()=>console.log(“非常成功!”)

函数延迟(ms){returnnewpromise((resolve,reject)=>setTimeout(resolve,ms))}
您可以这样编写它

fetch(“/myApi”)
.then(response=>response.json())
.然后(设置ifnotbar)
.然后(setIfMagicNotExist)
。然后(()=>console.log(“非常成功!”)
函数延迟(ms){returnnewpromise(resolve=>setTimeout(resolve,ms))}
函数setIfNotBar(data){data.foo!=“bar”?fetch(“/setFoo=bar”)。然后(delay(100))。然后(()=>data):data}

函数setIfMagicNotExist(data){data.magic!=“exist”?fetch(“/setMagic=exist”):data}
它似乎符合您的要求。如果您没有提供完整的跑步示例,那么很难找到您真正想要的。