Click here to Skip to main content
15,894,646 members
Please Sign up or sign in to vote.
1.33/5 (2 votes)
See more:
want to four functions one after another sequentiall.

What I have tried:

function serial(tasks) {
var prevPromise;
angular.forEach(tasks, function (task) {
//First task
if (!prevPromise) {
prevPromise = task();
} else {
prevPromise = prevPromise.then(task);
}
});
return prevPromise;
}


serial([task1, task2]);

function task1() {
var d = $q.defer();
$timeout(function () {
//some task
d.resolve();
}, 1000);
return d.promise;


};

function task2() {
var d = $q.defer();
$timeout(function () {
//some task
d.resolve();
}, 1000);
return d.promise;

};
Posted
Updated 14-Sep-16 6:45am

Please find the solution in the below plnkr -

Plunker[^]

You can also look into RxJs for more imperative sequential solution.

GitHub - Reactive-Extensions/RxJS: The Reactive Extensions for JavaScript[^]

Let me know if you've any questions.

Thank you.
 
Share this answer
 
Comments
abc123aaaa 18-Sep-16 3:35am    
app.controller("myctrl", function ($scope, $timeout, $filter, $q ) {

$scope.abc = function()
{

function isPromiseLike(obj) {
return obj && angular.isFunction(obj.then);
}
serial({ task1, task2 });

function serial(tasks) {
var prevPromise;
var error = new Error();
angular.forEach(tasks, function (task, key) {
var success = task.success || task;
var fail = task.fail;
var notify = task.notify;
var nextPromise;

//First task
if (!prevPromise) {
nextPromise = success();
if (!isPromiseLike(nextPromise)) {
error.message = "Task " + key + " did not return a promise.";
throw error;
}
}
else
{
//Wait until the previous promise has resolved or rejected to execute the next task

nextPromise = prevPromise.then(
/*success*/function (data) {
if (!success) { return data; }
var ret = success(data);
if (!isPromiseLike(ret)) {
error.message = "Task " + key + " did not return a promise.";
throw error;
}
return ret;
},
/*failure*/function (reason) {
if (!fail) { return $delegate.reject(reason); }
var ret = fail(reason);
if (!isPromiseLike(ret)) {
error.message = "Fail for task " + key + " did not return a promise.";
throw error;
}
return ret;
},
notify);
}
prevPromise = nextPromise;
});

return prevPromise || $delegate.when();
}


function task1() {

var d = $q.defer();
$timeout(function () {
//some task

d.resolve();
}, 1000);
return d.promise;
}

function task2() {

var d = $q.defer();
$timeout(function () {
//some task

d.resolve();
}, 1000);
return d.promise;
}
}
});

cordova app goes white screen when using $q.defer in angularjs.It works fine when running in ripple but not working in device.
Anurag Sharma 18-Sep-16 6:03am    
Can you share the error log from XCode or ADB terminal?
Did you have a look at async [^]?

It is available via npm / bower / etc. and has a broad variety of Control Flow Definitions [^], like applyEach or waterfall.

Probably this helps. And no, I won't do the coding for you ;-)
 
Share this answer
 
Comments
abc123aaaa 14-Sep-16 14:18pm    
i'm not asking for that also..

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900