0
votes

Async / attendre avec Event-Stream MapSync ne fonctionne pas

Le attendre code> Les commandes que j'ai commentées avec // ****** Cela attend ne fonctionne pas * / code> ne semble pas fonctionner. Je ne sais pas si cela est quelque chose lié au fait qu'ils sont dans un flux d'événements ou un problème avec la promesse dans le module importé.

Lorsque j'appelle la fonction code> exécuter code> à partir d'une matrice mappée pour insérer Les données de plusieurs sources, la fonction code> code> renvoie immédiatement plutôt que d'attendre jusqu'à ce que knex code> a terminé l'insertion des données. P>

Importing DI_ORDER_TYPE into table ln_order_type
Importing DI_DATES into table ln_dates
Importing WHINR140_INVENTORY into table ln_inventory
Importing WHWMD210_WAREHOUSE_ITEM_DATA into table ln_warehouse_item_data
Importing TDIPU010_ITEM_BUY_FROM_BP_INFORMATION into table ln_item_buy_from_bp_information
Importing TDIPU001_ITEM_PURCHASE_DATA into table ln_item_purchase_data
Importing TDPCG031_PRICE_BOOKS into table ln_price_books
Importing TDPUR300_PURCHASE_CONTRACTS into table ln_purchase_contracts
Importing TDPUR301_PURCHASE_CONTRACT_LINES into table ln_purchase_contract_lines
Inserted 72 records into table ln_order_type
Inserted 217 records into table ln_purchase_contracts
inserting 10000 records into table ln_inventory
Inserted 4694 records into table ln_purchase_contract_lines
inserting 10000 records into table ln_item_buy_from_bp_information
inserting 10000 records into table ln_dates
inserting 10000 records into table ln_inventory
inserting 10000 records into table ln_price_books
inserting 10000 records into table ln_item_purchase_data
inserting 10000 records into table ln_inventory
inserting 10000 records into table ln_price_books
inserting 10000 records into table ln_dates
inserting 10000 records into table ln_inventory
inserting 10000 records into table ln_price_books
inserting 10000 records into table ln_item_purchase_data


5 commentaires

Qu'est-ce que "ne fonctionne pas" signifie? Que fait exactement? Que vous attendez-vous à ce que ce soit ce n'est pas? Pouvez-vous couper le code de code à quelque chose de plus petit qui démontre le problème?


Il est difficile de le couper sans perdre son contexte. Comme je l'ai dit dans la question "lorsque j'appelle la fonction d'exécution à partir d'une matrice mappée pour insérer des données à partir de sources multiples, la fonction Exécuter renvoie immédiatement plutôt qu'attendre jusqu'à ce que Knex ait terminé l'insertion des données."


Jamais jamais passer async fonctionne comme rappels - pas sur nouvelle promesse , pas sur sur , pas sur , pas sur , pas à mappe * sync *.


@Bergi Je pense que maintenant mon problème est lié à avoir besoin d'acquisiiser l'événement (fin) pour le flux. Pas sûr de la façon de faire ça.


@Prestondocks assez simple en fait . Vous devriez cependant placer seulement le sur ("fin", résolution) et etc. gestionneurs à l'intérieur du nouvelle promesse constructeur, et rien d'autre.


3 Réponses :


0
votes

Vous n'êtes en attente que sur les fonctions internes dans la carte et non la fonction de niveau supérieur.

Vous devez ajouter un attendre à la fonction de niveau supérieur: xxx

sinon, vous n'attendez que dans la fonction interne et non dans le gestionnaire d'itinéraire lui-même.


4 commentaires

Malheureusement, cela ne fonctionne toujours pas même avec attendre la promesse.Tous (). J'ai ajouté un exemple de la sortie au bas de ma question. C'est après avoir ajouté la promesse.Tous ().


Cela ne convient pas à la situation. Parce que l'attente est déshonorée complètement dans la fonction


@AbDULSALEM Ce n'est pas, à cause de la carte sur la gamme de promesses et en attendant avec attendre


@Benjaminingruenbaum J'ai également pensé comme ça et j'ai trouvé un comportement très étrange quand je cours. Pour moi, cette chose est arrivée à la première fois et seulement à l'intérieur de JsSonsream et était très étrange. Ce que j'ai fini par je suis avec une sorte de hack pour le faire fonctionner.



0
votes

La solution pour moi était d'utiliser Bluebird Promise.Chaque

Cela traitera chacun des éléments de DataSources Array et attendra la promesse de revenir avant de traiter l'élément suivant de la liste. P>

Promise.each(dataSources, function(ds){
     ....
    }).then(()=>{
     ....
    })


0 commentaires

1
votes

J'ai mis en œuvre ma propre implémentation en écriture. Je pourrais contrôler les appels en séquence avec l'aide de la fonction de rappel. Soily lorsque le rappel est reçu de l'itération précédente, la prochaine itération est traitée. Je n'ai pas pu atteindre cet accès à l'utilisation de la carte de la carte d'événement

référence HTTPS: // Nodejs .org / API / Stream.html # stream_simplified_construction xxx


1 commentaires

Bon mais un rewicking sera nécessaire quand il y a beaucoup d'async attendu