You would possibly be better off with `login`, `share`, `publish` and `navigate` as promise-returning worker functions:

    var login = function() { return isLoggedIn ? null : facebookActions.login(); }
    var share = function() { return scope.sharingActions.shareOnFacebook(); };
    var publish = function() { return scope.model.publish() };
    var navigate = function() { return app.router.navigateToStories() };

Now you can sequence these workers with `.then()` as follows :

    var rootPromise = $.Deferred().resolve().promise();
    
    if (noViews) {
    	if(hasEditPermissions || !isLoggedIn) {
    		rootPromise.then(login).then(share).then(publish).then(navigate);
    	}
    	else {
    		rootPromise.then(share).then(navigate);
    	}
    }
    else if(hasEditPermissions) {
    	rootPromise.then(share).then(navigate);
    }

Notes:

 - `rootPromise` isn't strictly necessary but keeps rest of the code tidier, particularly `login()`.

 -  `login()` returns `null` if already logged in, allowing the calling logic to be slightly simpler.

 - The whole thing may simplify further depending largely on the relationship between `hasEditPermissions` and `isLoggedIn`.