gpt4 book ai didi

javascript - Promise.all().then() 转到 catch() 因为 then 不被识别

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

代码运行良好,直到 Promise.all 然后就直接跳转到“then 未定义”的地方。

我几个小时以来一直试图解决这个问题,但没有成功:(。

欢迎任何帮助。

这是一个简化的代码示例:

// Save
return new Promise((fulfillSave, rejectSave) => {
// Get
this._getObjects().then((object) => {
var promises = [];

// For each value
object.values.forEach((value) => {
promises.push(
// Create promise
new Promise((fulfill, reject) => {
// Create MDB object + assign value
valueMongoDB.value = value;
// Save
valueMongoDB.save((err, results) => {
if (err) {
reject('Error in saving');
} else {
fulfill();
}
});
})
);
});

// Wait for all promises
Promise.all(promises).then(() => {
// Nothing to do
fulfillSave();
}, then((err) => {
// Err
rejectSave(err);
}));
}
}).catch((err) => {
rejectSave(`Error: ${err.message}`);
});
});

提前致谢!谢尔盖。

最佳答案

这是不正确的:

// Wait for all promises
Promise.all(promises).then(() => {
// Nothing to do
fulfillSave();
}, then((err) => {
// ^^^^--------------------------- error here
// Err
rejectSave(err);
}));

它尝试调用一个名为then的独立函数,并将其返回值传递到Promise.all返回的对象上的then

我认为您正在尝试连接故障处理程序。如果是这样,您不必说then,您只需提供第二个函数:

Promise.all(promises).then(() => {
// Nothing to do
fulfillSave();
}, (err) => {
// Err
rejectSave(err);
}));

但是,当然,由于您没有使用该链的结果,并且只是将第二个函数接收到的单个参数传递给 rejectSave,因此您可以直接传递 rejectSave:

Promise.all(promises).then(() => {
// Nothing to do
fulfillSave();
}, rejectSave);
<小时/>

如果您告诉我们您的整体代码的用途及其输入是什么,我怀疑该代码可能会简单很多。创建和嵌套不必要的 Promise 是很常见的,我怀疑这里就发生了这种情况。

例如,如果您只想进行保存并返回一个 promise ,该 promise 将在全部成功完成时解决或在第一次失败时拒绝:

return this._getObjects()
.then(objects => Promise.all(objects.map(value => {
return new Promise((resolve, reject) => {
// Create MDB object + assign value
valueMongoDB.value = value;
// Save
valueMongoDB.save((err, results) => {
if (err) {
reject('Error in saving');
} else {
fulfill();
}
});
});
})));

或者如果我们给自己一个 Mongo 位的辅助函数:

function mongoSavePromise(value) {
return new Promise((resolve, reject) => {
// Create MDB object + assign value
valueMongoDB.value = value;
// Save
valueMongoDB.save((err, results) => {
if (err) {
reject('Error in saving');
} else {
fulfill();
}
});
});
}

然后:

return this._getObjects()
.then(objects => Promise.all(objects.map(mongoSavePromise)));

关于javascript - Promise.all().then() 转到 catch() 因为 then 不被识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43191035/

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