Rxjs Redux Observable:如何在承诺内返回操作?

Rxjs Redux Observable:如何在承诺内返回操作?,rxjs,redux-observable,Rxjs,Redux Observable,我有一部史诗: export default function uploadImage(action$, store) { return action$.ofType(userActions.UPLOAD_IMAGE) .mergeMap(action => { ... RNFetchBlob.fs.readFile(uploadUri, 'base64').then(data => { firebaseRef.putString(

我有一部史诗:

export default function uploadImage(action$, store) {
  return action$.ofType(userActions.UPLOAD_IMAGE)
    .mergeMap(action => {
      ...
      RNFetchBlob.fs.readFile(uploadUri, 'base64').then(data => {
        firebaseRef.putString(data).then(snapshot => {
          console.log('Uploaded a blob or file!');
          return Observable.of(userActions.updateImageURL(snapshot.downloadURL)); //<----------
        })
      });
    })
};
导出默认函数uploadImage(操作$,存储){
返回类型为的action$(userActions.UPLOAD\u图像)
.mergeMap(操作=>{
...
RNFetchBlob.fs.readFile(上传URI,'base64')。然后(数据=>{
firebaseRef.putString(数据)。然后(快照=>{
log('上载了一个blob或文件!');

返回Observable.of(userActions.updateImageURL(snapshot.downloadURL));//可能类似于:

export default function uploadImage(action$, store) {
  return action$
    .ofType(userActions.UPLOAD_IMAGE)
    .mergeMap(action => {
      ...
      Observable
        .fromPromise(RNFetchBlob.fs.readFile(uploadUri, 'base64'))
        .map(data => {
          firebaseRef.putString(data).then(snapshot => {
            console.log('Uploaded a blob or file!');
            return userActions.updateImageURL(snapshot.downloadURL);
          })
        });

可能是这样的:

export default function uploadImage(action$, store) {
  return action$
    .ofType(userActions.UPLOAD_IMAGE)
    .mergeMap(action => {
      ...
      Observable
        .fromPromise(RNFetchBlob.fs.readFile(uploadUri, 'base64'))
        .map(data => {
          firebaseRef.putString(data).then(snapshot => {
            console.log('Uploaded a blob or file!');
            return userActions.updateImageURL(snapshot.downloadURL);
          })
        });

除了Maxime answer之外,在您的示例中,实际的问题似乎是您没有真正返回承诺!您需要返回承诺,或者切换到使用隐式返回语法作为箭头

export default function uploadImage(action$, store) {
  return action$
    .ofType(userActions.UPLOAD_IMAGE)
    .mergeMap(action => {
      return Observable // don't forget to return this chain!
        .fromPromise(RNFetchBlob.fs.readFile(uploadUri, 'base64'))
        .map(data => {
          firebaseRef.putString(data).then(snapshot => {
            console.log('Uploaded a blob or file!');
            return userActions.updateImageURL(snapshot.downloadURL);
          })
        });

这是一个非常常见的错误,我们都犯过!

此外,为了最大化答案,在您的示例中,实际问题似乎是您没有真正返回承诺!您需要返回承诺或切换到使用隐式返回语法来返回箭头

export default function uploadImage(action$, store) {
  return action$
    .ofType(userActions.UPLOAD_IMAGE)
    .mergeMap(action => {
      return Observable // don't forget to return this chain!
        .fromPromise(RNFetchBlob.fs.readFile(uploadUri, 'base64'))
        .map(data => {
          firebaseRef.putString(data).then(snapshot => {
            console.log('Uploaded a blob or file!');
            return userActions.updateImageURL(snapshot.downloadURL);
          })
        });

这是一个非常常见的错误,我们都犯过!

hey@Maxime!我会不会只嵌套
可观察的。fromPromise
如果我有多个依赖于先前承诺结果的承诺?不,这是承诺(和可观察的)的重点。你可以将它们链接起来:)嘿@Maxime!如果我有多个承诺依赖于之前承诺的结果,我会嵌套
可观察的。fromPromise
吗?不,这是承诺(和可观察的)的重点。你可以将它们链接起来:)