Nodejs承诺的问题

时间:2017-08-01 17:55:18

标签: javascript node.js es6-promise

我有一系列函数调用,与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" });
            }
        });
    });
};

1 个答案:

答案 0 :(得分:0)

简短的回答是,您不会在链中的第一个承诺内调用rejectpending。承诺保持在doctorId状态。 Mozilla有一个很好的basic explanation of promises

如何修复

您似乎想在调用departmentId之前检索procedureIdsetDatacounterSchema.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>();
    }
}