gpt4 book ai didi

javascript - 解决嵌套的 Promise

转载 作者:太空宇宙 更新时间:2023-11-04 03:25:11 25 4
gpt4 key购买 nike

我想知道如何处理参数嵌套的 Promise。

我有这样的代码:

'use strict';

function fetchData(tableName) {
new Promise((resolve, reject) => {
if (tableName === 'tableName2') {
setTimeout(reject, 200, tableName);
} else {
setTimeout(resolve, 200, tableName);
}
});
}

function notifyUser(data) {
console.log(data); // get only undefined 3 times
new Promise((resolve) => {
setTimeout(resolve, 200, data);
});
}

let cont = { fail: () => '', success: () => console.log };
function verifyAndNotify(context) {
let actions = [];
['tableName1','tableName2','tableName3'].map(tableName => {
actions.push(notifyUser(fetchData(tableName))); // how to deal with this???
});

Promise.all(actions)
.then(success => {
console.log(`All is ok ${success}`);
}).catch(error => {
console.log(`error with: ${error}`);
errors.push(error);
});

if (errors.lenght > 0) {
return context.fail(`Errors: ${errors}`);
} else {
return context.success(`Success`);
}
}

verifyAndNotify(cont);

问题是我需要在将参数传递给方法之前解析它。我可能混合了一些我不擅长 JS 的东西。

我想通知用户每个表名,并且如果“表”操作失败(获取数据或通知),我想引发错误。

编辑1:

评论和回答后的第一个工作版本:

'use strict';

function fetchData(tableName) {
return new Promise((resolve, reject) => {
if (tableName === 'tableName2') {
setTimeout(reject, 200, tableName);
} else {
setTimeout(resolve, 200, tableName);
}
});
}

function notifyUser(data) {
console.log(data);
return new Promise((resolve) => {
setTimeout(resolve, 200, data);
});
}

const cont = { fail: (msg) => console.log('🌈' + msg), done: (msg) => console.log('🚨' + msg) };
function verifyAndNotify(context) {
const errors = [];
const actions = ['tableName1', 'tableName2', 'tableName3'].map(tableName =>
fetchData(tableName).then(notifyUser).catch(error => {errors.push(error);}));

Promise.all(actions)
.then(success => {
if (errors.length) throw errors;
else {
context.done(`Success ${success}`);
}
}).catch(errors => {
context.fail(`Errors: ${errors}`);
});
}

verifyAndNotify(cont);

最佳答案

正如 @Grundy 所说,第一个问题是你的函数需要返回 promise (返回新的 Promise ...)。

就您的操作列表而言,您可能希望将数组映射到 promise 数组:

const actions = ['tableName1', 'tableName2', 'tableName3'].map(tableName =>
fetchData(tableName).then(notifyUser));

此外,您似乎还需要每个有错误的 Promise 的列表,在这种情况下,您需要为每个操作 Promise 添加一个 catch ,因为一旦一个操作被拒绝,Promise.all 就会拒绝。例如:

const errors = [];
const actions = ['tableName1', 'tableName2', 'tableName3'].map(tableName =>
fetchData(tableName).then(notifyUser).catch(errors.push));
Promise.all(actions)
.then(success => {
if (errors.length) throw errors;
else {
console.log(`All is ok ${success}`);
context.done(`Success`);
}
}).catch(errors => {
context.fail(`Errors: ${errors}`);
});

关于javascript - 解决嵌套的 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45596546/

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