2016-11-29 2 views
0

Ich habe eine Reihe von Versprechen, und ich versuche, im Inneren einer anderen dispatch.then Funktion neue Versprechungen in diesem Array zu schieben, aber es scheint, dass das Array immer außerhalb des Bereichs istBinding Variable auf redux Versand ActionCreator

load(params, auth) { 
    return dispatch => { 
     const { passage, versions, language_tag } = params 
     let promises = [] 

     versions.forEach((id) => { 
      // get the version info, and then pass it along 
      dispatch(ActionCreators.version({ id: id })).bind(promises).then((version) => { 
       promises.push(dispatch(ActionCreators.passages({ 
        id: id, 
        references: [passage], 
        versionInfo: { 
         local_abbreviation: version.abbreviation, 
         local_title: version.title, 
         id: version.id, 
        }, 
       }))) 
      }) 
     }) 
     // 
     promises.push(dispatch(ActionCreators.configuration())) 
     promises.push(dispatch(ActionCreators.byRef({ language_tag }))) 

     console.log(promises.length) 
     return Promise.all(promises) 
    } 
}, 

Ich habe ein paar verschiedene Ansätze versucht, wie zum Beispiel var that = this direkt vor dem Versand innerhalb der Versionen loop, und was hier gezeigt wird, versuchen, .bind(promises) auf den Versand zu verwenden.

provents.length ist immer 2, (wegen der zwei, die eigentlich unten geschoben werden). Ich kann Anweisungen innerhalb des .then trösten, also weiß ich, dass es ausgeführt wird, aber die Versendungen enden nicht im Versprechungsarray.

Ich könnte sehr gut an die Versandfunktion in einer falschen Weise denken.

Jede Hilfe wäre willkommen!

Antwort

1

Das Problem ist, dass Sie, seit Sie die Versprechen auf then() hinzufügen, das Array bereits zurückgegeben haben, wenn Sie die Versprechen hinzufügen. Sie werden hinzugefügt, aber zu spät.

Stattdessen versuchen Sie dies:

load(params, auth) { 
    return dispatch => { 
    const { passage, versions, language_tag } = params; 
    let promises = []; 

    versions.forEach((id) => { 
     // get the version info, and then pass it along 
     promises.push(dispatch(ActionCreators.version({ id: id })).then((version) => { 
     return dispatch(ActionCreators.passages({ 
      id: id, 
      references: [passage], 
      versionInfo: { 
      local_abbreviation: version.abbreviation, 
      local_title: version.title, 
      id: version.id, 
      }, 
     })); 
     })); 
    }); 
    // 
    promises.push(dispatch(ActionCreators.configuration())); 
    promises.push(dispatch(ActionCreators.byRef({ language_tag }))); 

    console.log(promises.length); 
    return Promise.all(promises) 
    } 
} 
+0

Hey! Danke für die Antwort. Die Versendungen werden jetzt alle geschoben, nur dass es sagt, dass "Version" in den Passagenversand nicht definiert ist. Ich habe versucht, '.bind (version)' auch zu binden. – jacoballenwood

+0

Binden Sie nichts, da es nicht funktioniert. Der obige Code geht klar davon aus, dass die Version das Versprechen des ersten Aktionserstellers ist. Das ist wahrscheinlich nicht der Fall. Also schauen Sie in "ActionCreators.version" nach dem Problem. Stellen Sie sicher, dass es ein "Versprechen" zurückgibt, und stellen Sie sicher, dass das Versprechen in das erwartete Versionsobjekt aufgelöst wird. – DDS

+0

eigentlich habe ich falsch gesagt, dass die Version nicht definiert ist, es war etwas anderes in einer View-Datei! Das funktioniert super, danke! – jacoballenwood

Verwandte Themen