如何在.then .catch链中有条件地运行.then()函数?

时间:2018-02-27 15:06:27

标签: javascript asynchronous ecmascript-6 promise es6-promise

我的代码类似于:

int length=1;
void arrayinc(int** array, int x0, int x1)
{
    if (array == NULL)
        malloc(array, sizeof(int[2]));
    else
        realloc(array, (++length)*sizeof(int[2]));

    array[length-1][0]=x0;
    array[length-1][1]=x1;

    free(array);
}

int main()
{
    int** array=NULL;
    arrayinc(&array, 1, 2);
    // I will do some stuff after the increase
}

})

我只想在第一个承诺被拒绝且.catch函数触发后才运行bar()函数和.then .catch函数。

我试过这个:

router.post("/", (req, res, next) => {
foo()
.then((result) => {
    res.send(result)
})
.catch((error) => {
    cosnole.log(error)
})
//I only want the bar() function and everything below it to run if the first promise is rejected and the first .catch function ran
bar()
.then((data) => {
    res.send(data)
})
.catch((error) => {
    console.log(error)
})

})

但是当第一个foo()函数的错误被捕获并且拒绝承诺时,bar()函数永远不会被执行。

5 个答案:

答案 0 :(得分:4)

将调用移至 in catch。

router.post("/", (req, res, next) => {
    foo()
    .then((result) => {
        res.send(result)
    })
    .catch((error) => {
        cosnole.log(error);
        return bar()
        .then((data) => {
            res.send(data)
        })
        .catch((error) => {
            console.log(error)
        });
    });
});

答案 1 :(得分:3)

正如其他人提到的,你只需要在catch处理程序中移动代码。

但是,您可能希望简化并更正代码

router.post("/", (req, res, next) => {
    foo().catch(bar).then(result => {
        res.send(result);
    , error => {
        console.error(error);
        res.sendStatus(500); // or next(error) or whatever
    });
})

如果您想要记录foo中的错误,即使bar处理了错误,您也可能需要

foo().catch(error => {
    console.log(error, "(handled by bar)");
    return bar();
}).…

答案 2 :(得分:0)

鉴于代码的异步性,Drawable imageDrawable = Drawable.createFromStream("my_logo.png", null); imageView.setBackground(imageDrawable); 始终为if (rejected==true),因为该代码在第一个false或{{1}之前执行 }。

你可以:

将所有bar()[...]代码移到.catch()

then

在.catch()

之后移动.then()内的所有条件执行
catch

答案 3 :(得分:0)

I / O调用是异步发生的,所以在res.send()返回任何响应之前,您的if代码会运行。有几种方法可以处理这种情况,这是使用asyn/await编写看似同步的代码的另一种方法:

router.post("/", async (req, res, next) => {
rejected = false
try {
  await foo()
    .then((result) => {
      res.send(result)
    })
} catch {
  rejected = true
  console.log(error)
}
if(rejected == true)
  bar()
  .then((data) => {
    res.send(data)
  })
  .catch((error) => {
    console.log(error)
  })
})

答案 4 :(得分:-1)

尝试返回栏以实现承诺。

<div id="mainPage">
  <div class="bicycle" id="bicycleOriginal"></div>

  <p class="txt" id="mainTxt">DRAHTESEL</p>

  <div class="bicycle" id="bicycleFlipped"></div>
</div>

-----------------编辑-----------------

这是一个完全可测试的ExpressJS示例副本,包含您的问题:

router.post("/", (req, res, next) => {
    foo()
    .then((result) => {
        res.send(result)
    })
    .catch((error) => {
        console.log(error);
        return bar;
    })
    .then((data) => {
        res.send(data);
    })
    .catch((error) => {
        console.log(error)
    });
});