2016-05-05 5 views
0

Я по-прежнему новичок в написании кода для Node.js (исходя из PHP) и иногда пытаюсь понять, работают ли операции async корректно, особенно когда есть несколько вложенных вызовов базы данных/асинхронных операций ,Вложенные операции async в node.js

Например, в этом фрагменте кода (который использует mongo) будет ли программа заканчиваться только после того, как deleted был установлен в любых требуемых учетных записях? (См todo 1, 2 и 3):

// array of account emails to be compared against the accounts already in the database (using `email`) 
var emailsArray; 

accountsDatabase.find({}, {}) 
    .then(function (accountsInDB) { 
     return q.all(_.map(accountsInDB, function (dbAccount) { 
      // compare account's email in db with emails array in memory using .email 
      if ((emailsArray.indexOf(dbAccount.email) > -1) === false) { 

       // todo 1. should there be another 'then' here or is 'return' ok in order for it to work asynchronously? 

       return accountsInDB.updateById(dbAccount._id, {$set: {deleted: true}}); 
      } else { 

       // todo 2. is this return needed? 

       return; 
      } 
     })); 
    }) 
    .then(function() { 

     // TODO 3. WILL THE PROGRAM POTENTIALLY REACH HERE BEFORE `deleted` HAS BEEN SET ON THE REQUIRED ACCOUNTS? 

     callback(); // all of the above has finished 
    }) 
    .catch(function (err) { 
     callback(err); // failed 
    }); 
+1

Вместо того, чтобы принимать параметр «callback», вы просто должны «вернуть» обещание, которое вы произвели. – Bergi

ответ

2

должен там быть другой «затем» здесь или «вернуться» в порядке, для того, чтобы работать асинхронно?

return accountsInDB.updateById(dbAccount._id, {$set: {deleted: true}}); 

Вы можете цепи другой then здесь, если вы хотите/необходимость, но это не важно. Важно то, что вы получили return обещание от функции, чтобы ее можно было ожидать. Если вы этого не сделали, функция по-прежнему будет работать асинхронно, но не по порядку - она ​​просто продолжится сразу же после запуска операции обновления.

Нужно ли это возвращение?

else 
    return; 

Неа. Он просто возвращает undefined, как и без return. Вы можете опустить целую ветку else.

БУДЕТ ПРОГРАММА ПОТЕНЦИАЛЬНО ПОПАСТЬ ЗДЕСЬ ДО deleted было установлено равным требуемой СЧЕТОВ?

callback(); // all of the above has finished 

Нет, это не будет. map создает массив обещаний, а q.all дает обещание, которое ждет их всех (и выполняет множество результатов). then будет ждать этого обещания, которое возвращается от его обратного вызова до того, как цепочка продолжит работу.

+0

Круто спасибо, так что должно быть хорошо оставить, как есть, без каких-либо настроек? Кстати, теперь я добавил второй оператор return: 'return accountsInDB.updateById (dbAccount._id, {$ set: {deleted: false}});' – timhc22

+0

Я бы избегал этого 'callback' thingy, и если вообще , это должно быть '. then (function (res) {callback (null, res);}, function (err) {callback (err);})' [вместо '.then (...) .catch (...)' ] (http://stackoverflow.com/q/24662289/1048572). Но кроме этого все в порядке. Он работает, не так ли? – Bergi

+0

потрясающий, да, кажется, он работает отлично, спасибо за советы и пояснения :) – timhc22

Смежные вопросы