2017-02-19 5 views
0

У меня есть обещание цепи следующим образом:Используя функцию, которая возвращает обещание, внутри а, то() блок

return performTaskA(). 
then(performTaskB). 
then(performTaskC). 
then(performTaskD). 
then(performTaskE); 

performTaskD выглядит следующим образом:

function performTaskD() { 
    Model.something(). 
    then(function(result) { 
     something something with result; //BREAKPOINT 1 
    }); 
} 

Когда я бегу обещание цепь выше, BREAKPOINT 1 никогда не попадает, и управление переходит к performTaskE. Однако, когда я вызываю функцию performTaskD() отдельно, BREAKPOINT 1 получает удар. Что я делаю неправильно в случае с цепочкой обещаний?

Если я верну обещание в performTaskD, у меня все еще есть такая же проблема. Единственное различие заключается в том, что элемент управления никогда не переходит к performTaskE, и процесс завершается.

Для наглядности performTaskD выглядит следующим образом:

AccountModel.findById(acctId). 
    then(function (account) { 
     destAccount = account; //destAccount is a var declared in the outer scope. 
}); 
+1

Вы Шоуда 'return' обещание от' performTaskD' так, что он получает прикован должным образом – Bergi

+2

Покажите нам, что 'Model.something' делает. По-видимому, это проблема с запуском после других задач. Кроме того, вы пытались добавить обработчик ошибок? – Bergi

+0

@Bergi Model.something - это просто метод мангуста, который возвращает результат 'find()', используя обещание. – Ayush

ответ

2

returnPromise s

function performTaskD() { 
    return Model.something(). 
    then(function(result) { 
     return something something with result; //BREAKPOINT 1 
    }); 
} 
+0

Если я верну обещание в performTaskD, у меня все равно будет такая же проблема. Единственное отличие состоит в том, что элемент управления никогда не переходит к выполнению функции TaskE, и процесс завершается. – Ayush

+0

Предлагает включить '.catch()' в конце цепочки, чтобы определить, в чем проблема. – guest271314

+0

Я сделал. .catch() никогда не попадает – Ayush

0

По Mongoose documentationModel.find(something) не возвращает обещание. Вам необходимо позвонить Model.find(something).exec(). performTaskD должно быть что-то вроде:

function performTaskD(AcctId) { 
    return AccountModel.findById(AcctId).exec(). 
    then(function (account) { 
    destAccount = account; 
    return account; 
    }); 
} 
+0

Он возвращает возвращаемое значение, если вы не проходите обратный вызов, которого достаточно. – Bergi

+0

@ Bergi да, но вы не можете цеплять потом. Вам нужно настоящее обещание – Lucas

+0

... thenable, чей метод '.then' возвращает обещание. Он должен работать из коробки, единственное, чего не хватает, это другие методы из 'Promise.prototype'. – Bergi

0

«то» функция вызывается, когда обещание будет решена. В ваших задачах вы выполняете обещание внутри самой функции, поэтому остальная часть «then» не вызывает вызова.

Use Promise.resolve

function performTaskD() { 
    return Model.something(). 
    then(function(result) {    
     something something with result; //BREAKPOINT 1 
     Promise.resolve(result) 
    }); 
}