2015-07-14 3 views
2

Следующая регистрация в таком порядке: здесь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'); 
    }); 


}; 
+2

здесь5 никогда не будет последним. Вы вызываете 'sendResponse()' немедленно, так что здесь5 немедленно показывается. 'sendResponse()' затем возвращает функцию, которая передается обработчику '.then()', который не будет вызываться до тех пор, пока не будет разрешено обещание. Помните, что все операторы '.then()' выполняются немедленно. Обычно, просто сохраните ссылку на функцию, которая будет вызвана позже (так что это не так много), но когда вы помещаете 'sendResponse (...)' внутри '.then()', это выполняется немедленно. – jfriend00

+0

@ jfriend00 Как это объясняет здесь6, не регистрируясь? –

+0

Это не так. Я просто комментировал здесь5. Что возвращает 'Jobs.create()'? Ваш код действует так, как будто он отклоняет или бросает, и у вас нет обработчиков отказов, потому что после того, как вы его вызываете, дальнейшие обработчики выполняются. – jfriend00

ответ

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 также возвращает обещание, так это то, что возвращается функция, которая будет выполнена в прикован затем блокировать.

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); 
     }); 
    }; 
} 
+3

Цепочка работает, даже если обработчик '.then()' не возвращает обещание, так что часть вашего ответа неверна. Это просто не создает еще одно обещание ждать и, таким образом, продолжает синхронно. – jfriend00

+1

Теперь ваша функция saveJob не возвращает обещание (но другая функция). Зачем? – Bergi