我有一系列函数调用,与ES6 promises连接。显然,这个实现存在一些问题,因为对端点的API调用没有返回任何内容,并且浏览器仍在等待响应。
请告知。
module.exports.insertTreatmentDetails = function (req, res) {
var doctorId = 10000
var departmentId = 10000
var procedureid = 10000
var hospitalSchema = new hospitalModel();
var p = new Promise(function (resolve, reject) {
counterSchema.getNext('Treatment.doctor.doctorId', collection, function (doctorId) {
doctorId = doctorId;
})
counterSchema.getNext('Treatment.departmentId', collection, function (departmentId) {
departmentId = departmentId
})
counterSchema.getNext('Treatment.procedureid', collection, function (procedureid) {
procedureid = procedureid
})
}).then(function () {
setData()
}).then(function (){
hospitalSchema.save(function (error, data) {
if (error) {
logger.error("Error while inserting record : - " + error)
return res.json({ "Message": error.message.split(":")[2].trim() });
}
else {
return res.json({ "Message": "Data got inserted successfully" });
}
});
});
};
答案 0 :(得分:0)
简短的回答是,您不会在链中的第一个承诺内调用reject
或pending
。承诺保持在doctorId
状态。 Mozilla有一个很好的basic explanation of promises。
如何修复
您似乎想在调用departmentId
之前检索procedureId
,setData
和counterSchema.getNext
。您可以尝试将所有三个调用包装在一个promise中,检查是否所有三个调用都返回了每个回调中的内容,但理想的是每个异步任务都有一个promise。
如果改变const doctorPromise = new Promise((resolve, reject) =>
counterSchema.getNext('Treatment.doctor.doctorId', collection, id => {
doctorId = id;
resolve();
}));
是可行的,你可以让该函数返回一个promise,而不是接受一个回调。如果没有,我建议用自己的承诺包装每个电话。为了最大限度地保持您的代码目前的样子,可能如下所示:
Promise.all
然后,您可以通过调用var p = Promise.all([doctorPromise, departmentPromise, procedurePromise])
.then(setData)
.then(/* ... */);
替换第一个承诺:
setData
Promises允许您将值传递到下一步,因此如果您想要删除广泛范围的变量(或将它们设置在您调用resolve
的同一步骤中),您可以将counterSchema.getNext
作为回调传递给counterSchema.getNext
并在下一步中收集值(如果您Promise.all([/* ... */])
.then(([doctorID, departmentID, procedureID]) => {
// If you aren't changing `setData`
doctorId = doctorID;
departmentId = departmentID;
procedureid = procedureID;
setData();
// If you are changing `setData`
setData(doctorID, departmentID, procedureID);
}).then(/* ... */).catch(/* I would recommend adding error handling */);
返回承诺,也会如何执行此操作:
public class TestTextHandler : IHttpHandler
{
private readonly ITest _test;
public TestTextHandler(Test test)
{
_test = test;
}
}
public interface ITest
{
}
public class Test : ITest
{
}
public class RegisterContainer : IServicesConfigurator
{
public void Configure(IServiceCollection serviceCollection)
{
serviceCollection.AddTransient<ITest, Test>();
}
}