2017-07-16 7 views
0

J'essaie de créer une partie Web SPFx. Avant de pouvoir créer un nouvel élément, je dois appeler 0-438 fois _ensureUser, en fonction de la combinaison de Client, AssignedTo, ResolvedBy et Referrer. Lorsque tous les appels requis _ensureUser sont terminés, le nouvel élément peut être créé.TypeScript/SPFx Promises throws Exception ("Impossible de lire la propriété 'puis' de indéfini") mais semble fonctionner

Le code s'exécute lors du débogage sur le plan de travail hébergé, mais déclenche une exception lorsque j'appelle userPromises[0].then((value: {}) => { ... ou Promise.all(userPromises).then((value: {}[]) => { .... Lorsque je clique sur F5/continuer, le reste est exécuté et le nouvel élément est créé. _ensureUser a fonctionné quand je l'ai appelé directement et l'ai enchaîné avec then, sans le mettre d'abord dans le tableau userPromises.

Je pense que le problème est que _ensureUser ne renvoie pas un Promise. Si oui, comment ferais-je cela? Dois-je restructurer _ensureUser et/ou createItem? Ai-je besoin d'appeler bind quelque part?

La fonction createItem:

public createItem(logItem: IInteractionLogItem): Promise<IInteractionLogItem[]> { 
    const userPromises: Promise<{}>[] = []; 

    if(logItem.Client && logItem.Client.AccountName){ 
    userPromises.push(this._ensureUser(logItem.Client)); 
    } 

    if(logItem.AssignedTo && logItem.AssignedTo.AccountName){ 
    userPromises.push(this._ensureUser(logItem.AssignedTo)); 
    } 

    if(logItem.ResolvedBy && logItem.ResolvedBy.AccountName){ 
    userPromises.push(this._ensureUser(logItem.ResolvedBy)); 
    } 

    if(logItem.Referrer && logItem.Referrer.AccountName){ 
    userPromises.push(this._ensureUser(logItem.Referrer)); 
    } 

    console.log("SharePointDataProvider.CreateItem: userPromises.length=" + userPromises.length); 

    if(userPromises.length == 0) { 
     const batch: SPHttpClientBatch = this.webPartContext.spHttpClient.beginBatch(); 

     const batchPromises: Promise<{}>[] = [ 
     this._createItem(batch, logItem), 
     this._getItemsBatched(batch) 
     ]; 

     return this._resolveBatch(batch, batchPromises); 
    } else if(userPromises.length == 1) { 
    userPromises[0].then((value: {}) => { 
     const batch: SPHttpClientBatch = this.webPartContext.spHttpClient.beginBatch(); 

     const batchPromises: Promise<{}>[] = [ 
     this._createItem(batch, logItem), 
     this._getItemsBatched(batch) 
     ]; 

     return this._resolveBatch(batch, batchPromises); 
    }); 
    } else { 
    Promise.all(userPromises).then((value: {}[]) => { 
     const batch: SPHttpClientBatch = this.webPartContext.spHttpClient.beginBatch(); 

     const batchPromises: Promise<{}>[] = [ 
     this._createItem(batch, logItem), 
     this._getItemsBatched(batch) 
     ]; 

     return this._resolveBatch(batch, batchPromises); 
    }); 
    } 
} 

La fonction _ensureUser:

private _ensureUser(user: IInteractionLogPerson): Promise<ISPUser> { 
    console.log("SharePointDataProvider.EnsureUser(\"" + user.AccountName + "\")"); 
    var data = {logonName: user.AccountName}; 

    return this._webPartContext.spHttpClient.post(
    this._ensureUserUrl, 
    SPHttpClient.configurations.v1, 
    { body: JSON.stringify(data) }).then(
     (value: SPHttpClientResponse) => { 
     console.log("SharePointDataProvider.EnsureUser Got Http Response:\"" + value.statusText + "\""); 
     return value.json(); 
     }, 
     (error: any) => console.log("SharePointDataProvider.EnsureUser Rejected: " + error) 
    ).then((spUser: ISPUser) => { 
     console.log("SharePointDataProvider.EnsureUser Set Id:" + spUser.Id +" LoginName:\"" + spUser.LoginName + "\""); 
     user.Id = spUser.Id; 
     return spUser; 
    }); 
} 

la sortie de débogage pour 1 _ensureUser appel:

SharePointDataProvider.EnsureUser("i:0#.f|membership|[email protected]") 
SharePointDataProvider.CreateItem: userPromises.length=1 
TypeError: Cannot read property 'then' of undefined 
    at ILoggerContainer._createInteractionLogItem (d:\spfx\iLogger-webpart\dist\i-logger.bundle.js:22103:60) 
    at ILoggerForm._handleAddButtonClick (d:\spfx\iLogger-webpart\dist\i-logger.bundle.js:23173:21) 
    at Object.r (https://spoprod-a.akamaihd.net/files/sp-client-prod_2017-06-30.017/sp-webpart-workbench-assembly_en-us_f3fed222daad2a0117a4c168deed7705.js:174:75541) 
    at a (https://spoprod-a.akamaihd.net/files/sp-client-prod_2017-06-30.017/sp-webpart-workbench-assembly_en-us_f3fed222daad2a0117a4c168deed7705.js:174:30260) 
    at Object.s [as executeDispatchesInOrder] (https://spoprod-a.akamaihd.net/files/sp-client-prod_2017-06-30.017/sp-webpart-workbench-assembly_en-us_f3fed222daad2a0117a4c168deed7705.js:174:30475) 
    at f (https://spoprod-a.akamaihd.net/files/sp-client-prod_2017-06-30.017/sp-webpart-workbench-assembly_en-us_f3fed222daad2a0117a4c168deed7705.js:174:26933) 
    at m (https://spoprod-a.akamaihd.net/files/sp-client-prod_2017-06-30.017/sp-webpart-workbench-assembly_en-us_f3fed222daad2a0117a4c168deed7705.js:174:27059) 
    at Array.forEach (<anonymous>) 
    at r (https://spoprod-a.akamaihd.net/files/sp-client-prod_2017-06-30.017/sp-webpart-workbench-assembly_en-us_f3fed222daad2a0117a4c168deed7705.js:174:112499) 
    at Object.processEventQueue (https://spoprod-a.akamaihd.net/files/sp-client-prod_2017-06-30.017/sp-webpart-workbench-assembly_en-us_f3fed222daad2a0117a4c168deed7705.js:174:28121) 
SharePointDataProvider.EnsureUser Got Http Response:"OK" 
SharePointDataProvider.EnsureUser Set Id:13 LoginName:"i:0#.f|membership|[email protected]" 

la sortie de débogage pour 2 _ensureUser appels:

SharePointDataProvider.EnsureUser("i:0#.f|membership|[email protected]") 
SharePointDataProvider.EnsureUser("i:0#.f|membership|[email protected]") 
SharePointDataProvider.CreateItem: userPromises.length=2 
TypeError: Cannot read property 'then' of undefined 
    at ILoggerContainer._createInteractionLogItem (d:\spfx\iLogger-webpart\dist\i-logger.bundle.js:22103:60) 
    at ILoggerForm._handleAddButtonClick (d:\spfx\iLogger-webpart\dist\i-logger.bundle.js:23173:21) 
    at Object.r (https://spoprod-a.akamaihd.net/files/sp-client-prod_2017-06-30.017/sp-webpart-workbench-assembly_en-us_f3fed222daad2a0117a4c168deed7705.js:174:75541) 
    at a (https://spoprod-a.akamaihd.net/files/sp-client-prod_2017-06-30.017/sp-webpart-workbench-assembly_en-us_f3fed222daad2a0117a4c168deed7705.js:174:30260) 
    at Object.s [as executeDispatchesInOrder] (https://spoprod-a.akamaihd.net/files/sp-client-prod_2017-06-30.017/sp-webpart-workbench-assembly_en-us_f3fed222daad2a0117a4c168deed7705.js:174:30475) 
    at f (https://spoprod-a.akamaihd.net/files/sp-client-prod_2017-06-30.017/sp-webpart-workbench-assembly_en-us_f3fed222daad2a0117a4c168deed7705.js:174:26933) 
    at m (https://spoprod-a.akamaihd.net/files/sp-client-prod_2017-06-30.017/sp-webpart-workbench-assembly_en-us_f3fed222daad2a0117a4c168deed7705.js:174:27059) 
    at Array.forEach (<anonymous>) 
    at r (https://spoprod-a.akamaihd.net/files/sp-client-prod_2017-06-30.017/sp-webpart-workbench-assembly_en-us_f3fed222daad2a0117a4c168deed7705.js:174:112499) 
    at Object.processEventQueue (https://spoprod-a.akamaihd.net/files/sp-client-prod_2017-06-30.017/sp-webpart-workbench-assembly_en-us_f3fed222daad2a0117a4c168deed7705.js:174:28121) 
SharePointDataProvider.EnsureUser Got Http Response:"OK" 
SharePointDataProvider.EnsureUser Set Id:10 LoginName:"i:0#.f|membership|[email protected]" 
SharePointDataProvider.EnsureUser Got Http Response:"OK" 
SharePointDataProvider.EnsureUser Set Id:13 LoginName:"i:0#.f|membership|[email protected]" 
+0

Si ma structure/modèle est faux/pauvre, s'il vous plaît me donner un exemple comment structurer une bonne. Je suis assez nouveau à l'ensemble de la chose Promise et déjà mis en place un anti-modèle avant :-) –

Répondre

0

je devais ajouter un return avant d'appeler userPromises[0].then((value: {}) => { ... ou Promise.all(userPromises).then((value: {}[]) => { .... Le code fonctionne maintenant avec la modification suivante:

return userPromises[0].then((value: {}) => { 

et

return Promise.all(userPromises).then((value: {}[]) => {