2015-07-12 2 views
4

я иметь следующую структуру и нужно упростить,Цепных несколько обещаний в Angularjs

Resuable service1 взаимодействовать с индексированной

function isDbExist(){ 
// do something , it return either reject or resolve 
} 

function createDB(){ 
// do something , it return either reject or resolve 
} 

function getData(){ 
    // do something , it return either reject or resolve 
} 

В другом service2 я впрыскивание этого Service1 и используя функции, такие

function1(){ 
service1.isDbExist.then(function(data){ 
    service1.createDB.then(function(data){ 
     service1.getData.then(function(data){ 
     referred.resolve(data); 
     },function(error){ 
     deferred.reject(error) 
     }) 
    },function(error){ 
    deferred.reject(error); 
    }) 
},function(error){ 
    deferred.reject(error); 
}) 
} 

проблема здесь читаемость кода не является хорошим, его не так легко отлаживать, какие отклонять функция, для которой обещают. Это их хороший способ сделать это? Я прочитал о $ q.all, но не применим это в этой ситуации.

ответ

5

Точно так же красота обещаний заключается в том, что вы можете связать их, а не вставлять их, как обратные вызовы. Вы можете вернуть другое обещание при работе с предыдущим:

isDbExists().then(function(db) { 
    // do something 
    return createDb(); 
}).then(function(db) { 
    // do something with with the resolved db.. 
    return getData(); 
}).then(function(data) { 
    // Do something with data 
}).catch(function(error) { 
    // Uh oh, something went wrong. Deal with error 
}); 

Наконец, вы имеете дело с ошибкой, которая могла произойти.

+0

Вы можете объяснить, почему вы используете возврат? –

+0

Возвращение обещания в 'then()' позволяет вам обещать цепочку таким образом – juco

+0

Как работает dfsq без возврата? –

5

Вы можете цепь несколько обещаний, как это:

service1.isDbExist() 
    .then(service1.createDB) 
    .then(service1.getData) 
    .then(function() { 
     // DB exists, created and data loaded 
    }) 
    .catch(function(err) { 
     console.log('Handle error', err); // isDbExist, createDB or getData rejected 
    }); 

Проверка интерактивной демо, чтобы увидеть, как данные успехи и ошибки передается к следующему обещанию в цепи и как вы имеете полный контроль над процессом на каждом шагу:

Demo: http://plnkr.co/edit/PM06e8NGJvHKmoJ9C2Lf?p=info

+0

Если isDBExist передает что-то в решении, как бы получить это значение в .then (service1.createDB)? –

+0

То, что я написал, эквивалентно 'service1.isDbExist(). Then (function (data) {return service1.createDB (data);}). Then (function (data) {return service1.getData (data);}). .' поэтому вам не нужно беспокоиться о передаче данных в следующую, затем в цепочку. – dfsq

+0

отлично подходит для меня: http://plnkr.co/edit/PM06e8NGJvHKmoJ9C2Lf?p=preview – dfsq

0

Одним из действительно больших вещей о обещаниях, что они могут быть соединены так:

function1(){ 
    return service1.isDbExist.then(function(exists){ 
    if(!exists) return service1.createDB() 
    }) 
    .then(function() { 
    return service1.getData('some', 'args') 
    }); 
} 

Помните, что .then получит результат предыдущей функции, например, существо будет логическим. function1 также вернет обещание, и это обещание вернет разрешенное/отклоненное обещание от service1.getData.

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