gpt4 book ai didi

javascript - 如何在 ES6 Promise 中使用递归?

转载 作者:行者123 更新时间:2023-12-03 03:30:21 25 4
gpt4 key购买 nike

我想使用 axios get 请求检查具有新设置 id 的帖子是否已存在。 (我在前端这样做是因为我不控制后端)

但是,当具有该 id 的帖子已经存在以及它所在的 promise 时,我不确定如何组合我想要的递归。

这是我到目前为止得到的:

import axios from 'axios';
import uuidv4 from 'uuid/v4';

export function newPost(post) {
return (dispatch) => {
getUniqueId.then((id) => {
// post new post with unique id
// dispatch({ type: NEW_POST_FULFILLED, payload: err });
}).catch((err) => {
dispatch({ type: NEW_POST_FAILED, payload: err });
})
}
}

const getUniqueId = new Promise((resolve, reject) => {
checkUniqueId(resolve, reject, uuidv4())
});

const checkUniqueId = (resolve, reject, id) => {
axios
.get(`${api}/posts/${id}`, { headers })
.then((resp) => checkUniqueId(resolve, reject, uuidv4()))
.catch((err) => {
if(err.response.status === 500) {
resolve(id);
} else {
reject(err);
}
});
}

最佳答案

几个问题:

  • getUniqueId 应该是一个函数,因为每次调用 newPost 时您都希望获得一个新的 id。

  • 您不应使用 promise constructor antipattern :不要创建新的 Promise,而只是返回 Promise 本身,或者在需要拒绝时抛出

这是更正后的代码:

export function newPost(post) {
return (dispatch) => {
// Call as function!
getUniqueId().then((id) => {
// post new post with unique id
// dispatch({ type: NEW_POST_FULFILLED, payload: err });
}).catch((err) => {
dispatch({ type: NEW_POST_FAILED, payload: err });
})
}
}

// Define as function, and just return the promise from `checkUniqueId`
const getUniqueId = _ => checkUniqueId(uuidv4());

const checkUniqueId = (id) => {
// return the promise!
return axios
.get(`${api}/posts/${id}`, { headers })
.then((resp) => checkUniqueId(uuidv4()))
.catch((err) => {
if (err.response.status === 500) {
return id;
} else {
throw err; // throw the error to cascade it through the chain
}
});
}

关于javascript - 如何在 ES6 Promise 中使用递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46129653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com