Подойдет ли это дело для $q?


У меня возникли проблемы с определением, следует ли мне использовать $q для следующего сценария с кодированием psuedo:

function create() {

    if (condition1) {
        // ajax call that needs to update
        // the object to be passed into Service.create()
    }

    if (condition2) {
        // ajax call that doesn't make updates to object
    }

    Service.create(object).success(function() {
        // the object was passed here
    });

}
Примечание: condition1 и condition2 являются взаимоисключающими.

Ранее я делал нечто подобное:

function create() {

    if (condition1) {
        // on ajax success
        callServiceCreate(object);
        return;
    }

    if (condition2) {
        // ajax call that doesn't make updates to object
    }

    callServiceCreate(object);

}

function callServiceCreate(object) {

    Service.create(object).success(function() {
        // the object was passed here
    });

}

И это работает, но мне интересно, подойдет ли этот случай для $q.

Если я оберну condition1 с помощью конструктора $q:

if (condition1) {
    return $q(function(resolve, reject) {
        // ajax success
        resolve(data);
    }
}

Как я могу достичь той же функциональности, но вызвать callServiceCreate() / Service.create() только один раз?

1   2   2015-06-26 23:32:51

1 ответ:

Очевидно, что вы можете использовать $q.when здесь, что передаст функцию promise when

Код

function create() {
    var condition1Promise;
    if (condition1) {
        condition1Promise = callServiceCreate(object);
    }

    if (condition2) {
        // ajax call that doesn't make updates to object
    }

    $q.when(condition1Promise).then(function(){
        Service.create(object).success(function() {
            // modify object here
            // the object was passed here
        });
    })
}

function callServiceCreate(object) {
    //returned promise from here to perform chain promise
    return Service.create(object).then(function(data) {
        // the object was passed here
        return data;
    });
}