Promise.all().then() 转到 catch(),因为 then 无法识别



代码运行良好,直到 Promise.all 然后直接进入 catch 说"then is not defined"。

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

欢迎任何帮助。

下面是一个简化的代码示例:

// 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);

如果你告诉我们你的整体代码要做什么以及它的输入是什么,我怀疑这些代码可以简单得多。不必要地创建和嵌套承诺是很常见的,我怀疑这里正在发生这种情况。

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

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)));

避免Promise构造函数反模式!

你的整个代码应该是一个简单的

return this._getObjects().then(object => {
var promises = object.values.map(value => {
// Create MDB object + assign value
valueMongoDB.value = value; 
// Save
return valueMongoDB.save().catch(err => {
throw 'Error in saving';
});
});
// Wait for all promises
return Promise.all(promises);
}, err => {
throw `Error: ${err.message}`;
});

没有不必要的回调,没有错误的余地。顺便说一句,你不应该throw字符串。

最新更新