Résolution synchrone de la promesse (bluebird vs. jQuery)

J'ai développé une petite lib pour le Dynamics CRM REPOS/ODATA webservice (CrmRestKit). La lib dependes sur jQuery et utilise la promesse d'un motif, repectivly la promesse comme motif de jQuery.

Maintenant, j'aime le port de cette lib pour bluebird et retirer le jQuery de dépendance. Mais je suis confronté à un problème car bluebird ne prend pas en charge le synchrone de la résolution de la promesse-objets.

Certaines informations de contexte:

L'API de la CrmRestKit si l'on excepte un paramètre facultatif qui définit si le web-appel de service doivent être effectuées dans la synchronisation ou la mode asynchrone:

CrmRestKit.Create( 'Account', { Name: "foobar" }, false ).then( function ( data ) {
   ....
} );

Lorsque vous passez "vrai" ou omettre le dernier paramètre, la méthode créée le dossier à synchroniser. mode.

Parfois, il est nécessaire d'effectuer une opération de synchronisation en mode, par exemple, vous pouvez écrire du code JavaScript pour Dynamics CRM est involed pour le sauver-cas d'une forme et dans ce gestionnaire d'événements, vous devez effectuer la synchronisation pour la validation (par exemple, de valider qu'un certain nombre de documents existent, dans le cas où le nombre de documents existent, annuler l'enregistrement d'opération, et afficher un message d'erreur).

Mon problème est maintenant le suivant: bluebird ne prend pas en charge la résolution dans sync-mode. Par exemple quand je fais la suite, la "puis" gestionnaire est appelé en mode asynchrone:

function print( text ){

    console.log( 'print -> %s', text );

    return text;
}

///
///'Promise.cast' cast the given value to a trusted promise. 
///
function getSomeTextSimpleCast( opt_text ){

    var text = opt_text || 'Some fancy text-value';

    return Promise.cast( text );
}

getSomeTextSimpleCast('first').then(print);
print('second');

Le résultat est le suivant:

print -> second
print -> first

Je m'attends à ce que le "second" s'affiche après la "première" car la promesse est déjà résolu avec une valeur. Donc, je suppose que puis-gestionnaire d'événements est immédiatement appelée lorsqu'il est appliqué sur une question déjà résolue promesse-objet.

Quand je fais la même chose (utiliser alors déjà résolu promesse) avec jQuery, je vais avoir mon résultat attendu:

function jQueryResolved( opt_text ){

    var text = opt_text || 'jQuery-Test Value',
    dfd =  new $.Deferred();

    dfd.resolve(text);

        //return an already resolved promise
    return dfd.promise();
}

jQueryResolved('third').then(print);
print('fourth');

Cela génère la sortie suivante:

print -> third
print -> fourth

Est-il un moyen de faire bluebird travailler de la même façon?

Mise à jour:
Le code fourni est juste pour illustrer le problème. L'idée de la lib est: Indépendamment de l'exécution en mode sync, async) l'appelant sera toujours face à une promesse-objet.

Concernant "... la demande de l'utilisateur... ne semble avoir aucun sens": Lorsque vous fournissez des deux méthodes "CreateAsync" et "CreateSync" il est également à l'utilisateur de décider de la façon dont l'opération est exécutée.

De toute façon avec la mise en œuvre actuelle le comportement par défaut (dernier paramètre est facultatif) est une exécution asynchrone. Donc 99% du code exige une promesse-objet, le paramètre facultatif est à utiliser uniquement pour le 1% des cas où vous avez simplement besoin d'une synchronisation de l'exécution. En outre, j'ai développé de lib pour moi-même et je l'utilise dans 99,9999% des cas, le mode asynchrone, mais je pensais que c'est agréable d'avoir la possibilité d'aller à la synchronisation de la route que vous le souhaitez.

Mais je pense que je suis au point une méthode de synchronisation doit simplement retourner la valeur. Pour la prochaine version (3.0) je vais mettre en œuvre "CreateSync" et "CreateAsync".

Merci pour vos commentaires.

Mise à jour-2
Mon intension pour le paramètre facultatif est d'assurer un consistend comportement ET prévenir erreur de logique. Supposons que votre en tant que consommateur de ma methode "GetCurrentUserRoles" qui utilise une lib. Donc, la méthode sera toujours retourner une promesse, cela signifie que vous devez utiliser le "puis" la méthode à exécuter du code qui dépend du résultat. Ainsi, lorsque certaines écrit ce code, je suis d'accord c'est totalement faux:

var currentUserRoels = null;

GetCurrentUserRoles().then(function(roles){

    currentUserRoels = roles;
});

if( currentUserRoels.indexOf('foobar') === -1 ){

    //...
}

Je suis d'accord que ce code va casser lorsque la méthode "GetCurrentUserRoles" changements de synchronisation async.

Mais je comprends que ce que je pas un bon design, parce que le consommateur doit maintenant qu'il traite avec une méthode asynchrone.

source d'informationauteur thuld