代码运行良好,直到Promise.all,然后直接进入捕获,说'然后没有定义'。
我一直试图在数小时内没有成功:(。
欢迎任何帮助。
以下是代码的简化示例:
// 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}`);
});
});
提前致谢! 哔叽。
答案 0 :(得分:3)
这是不正确的:
// Wait for all promises
Promise.all(promises).then(() => {
// Nothing to do
fulfillSave();
}, then((err) => {
// ^^^^--------------------------- error here
// Err
rejectSave(err);
}));
它正在尝试调用一个名为then
的独立函数,并将其返回值传递给then
返回的对象上的Promise.all
。
我认为你正在尝试连接失败处理程序。如果是这样,你没有说then
,你只提供第二个功能:
Promise.all(promises).then(() => {
// Nothing to do
fulfillSave();
}, (err) => {
// Err
rejectSave(err);
}));
但是,当然,既然你没有使用该链的结果而你只是将第二个函数接收的单个参数传递给rejectSave
,那么你可以直接传递rejectSave
:< / p>
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)));
答案 1 :(得分:1)
避免使用Promise
constructor antipattern!
您的整个代码应该是一个简单的
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}`;
});
没有不必要的回调,没有错误的余地。顺便说一句,you shouldn't throw
strings。