承诺未按正确顺序运行

时间:2015-07-14 02:41:51

标签: node.js promise sails.js q bluebird

以下是按此顺序登录:here1 here2 here5 here3 here4。虽然,here5应该是最后的,但它根本没有到达here6。我怎样才能将here1转到here6以便按顺序正常运行?我正在使用Sailsjs和bluebird。

//manually wrapping a callback API like Kaiseki
function createKaisekiObject(className, job) {
    console.log('here2');
    return new Promise(function(resolve, reject) {
        kaiseki.createObject(className, job, function(err, res, body, success) {
            //resolve or reject the promise
            if (err) {
                reject(err);
                return;
            }
            console.log('here3');
            resolve(body);
        });
    });
}

function saveJob(body) {
    console.log('here4', body);

    return Jobs.create({
        owner: req.user.id,
        jobId: body.objectId
    });
}

function sendResponse(req, res) {
    console.log('here5');

    return function(savedJob) {
        console.log('here6', savedJob, req, res);

        // res.json({
        //  success: true,
        //  message: "Running analysis on game",
        //  jobId: savedJob.jobId
        // });
        //return the job
        return savedJob;
    };
}

module.exports.index = function(req, res) {
    console.log('here1');
    var jobId = uuid.v4();
    var job = {
        owner: req.user.id,
        numOfGames: 1,
        numOfGamesCompleted: 0
    };
    var className = 'jobs';
    //promise
    var createJob = createKaisekiObject(className, job)
    .then(saveJob)
    .then(sendResponse(req, res));

    //when first step is done, do more stuff...
    createJob.then(function(savedJob) {
        //do more stuff here...
        console.log('here6');
    });


};

1 个答案:

答案 0 :(得分:3)

首先,我不相信Jobs.create会返回一个承诺,所以如果你想继续链接,你需要把它包装成一个。

function saveJob(body) {
    console.log('here4', body);

    return function(body) {
        return new Promise(function(resolve, reject) {
            Jobs.create({
                owner: req.user.id,
                jobId: body.objectId
            }).exec(function(err, job) {
                resolve(job);
            });
        });
    };
}

接下来确保sendResponse返回的函数也返回一个promise,因为它是返回的函数,它将在链接的块中执行。

function sendResponse(req, res) {
    console.log('here5');

    return function(savedJob) {
        return new Promise(function(resolve, reject) {
            console.log('here6', savedJob, req, res);
            res.json({
                success: true,
                message: "Running analysis on game",
                jobId: savedJob.jobId
            });
            //return the job
            resolve(savedJob);
        });
    };
}