Следующая регистрация в таком порядке: здесь1 здесь2 здесь5 здесь3 здесь4. Хотя, здесь5 должно быть последним, и он совсем не доходит досюда6. Как я могу получить здесь 1 здесь6, чтобы все нормально работало? Я использую 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');
});
};
здесь5 никогда не будет последним. Вы вызываете 'sendResponse()' немедленно, так что здесь5 немедленно показывается. 'sendResponse()' затем возвращает функцию, которая передается обработчику '.then()', который не будет вызываться до тех пор, пока не будет разрешено обещание. Помните, что все операторы '.then()' выполняются немедленно. Обычно, просто сохраните ссылку на функцию, которая будет вызвана позже (так что это не так много), но когда вы помещаете 'sendResponse (...)' внутри '.then()', это выполняется немедленно. – jfriend00
@ jfriend00 Как это объясняет здесь6, не регистрируясь? –
Это не так. Я просто комментировал здесь5. Что возвращает 'Jobs.create()'? Ваш код действует так, как будто он отклоняет или бросает, и у вас нет обработчиков отказов, потому что после того, как вы его вызываете, дальнейшие обработчики выполняются. – jfriend00