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]"
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 :-) –