javascript - RXJS redux observable 执行多个 api 调用

标签 javascript ecmascript-6 rxjs redux-observable

我有一个联系人数组,我想为联系人数组中的每个对象执行 API 调用。 我尝试遍历每个项目并调用 fetchJson$,但是,我意识到这种方法是不正确的。

使用 RXJS Redux Observables 执行此操作的正确方法是什么?

此外,这是针对此问题的伪代码,因此请忽略任何语法错误。

export const createPost = (action$, store) => (
  action$.ofType(UPDATE_USER_CONTACTS)
    .switchMap(() => {
      const state = store.getState();
      const userToken = getUserToken(state);
       const userId = getuserId(state);
       const listOfContacts = getListUserContacts(state);

      return Observable.concat(
        // 1. show loading
        Observable.of(showSpinner()),
        // 2. set the timer
        Observable.defer(() => {

          const contacts = [
            {
              id: '123',
              name: 'Paul',
              phoneNumber: '000-000-00'
            },
            {
              id: '098',
              name: 'Sarah',
              phoneNumber: '111-111-11'
            },
          ]

          contacts.forEach((contact) => { 
            return fetchJson$('PUT', `${API_URL}/users/${userId}/user_contacts/${contact.id}`, userToken, {
              id: contact.id,
              name: contact.name,
              phoneNumber: contact.phoneNumber,
            })
          }, false)
            .flatMap(() => (
              Observable.of(
                reset(),
                notification({
                  icon: 'm-timers',
                  text: '<b>Good - worked</b>.',
                }),
              )
            ))
            .catch(({ response }) => {
              const responseArray = [];
              if (response) {
                console.log(response, 'there was a response')
              }
              return Observable.of(...responseArray);
            });
        }),
        Observable.defer(() => {
          // perform another action here
        },
        // 4. hide loading
        Observable.of(hideSpinner()),
      );
    })
);

最佳答案

我认为您正在寻找 forkJoin:

signature: forkJoin(...args, selector : function): Observable . When all observables complete, emit the last emitted value from each.

const contacts = [
    {
        id: '123',
        name: 'Paul',
        phoneNumber: '000-000-00'
    },
    {
        id: '098',
        name: 'Sarah',
        phoneNumber: '111-111-11'
    },
];
Observable.forkJoin(
    contacts.map((contact) => {
            return fetchJson$('PUT', `${API_URL}/users/${userId}/user_contacts/${contact.id}`, userToken, {
                id: contact.id,
                name: contact.name,
                phoneNumber: contact.phoneNumber,
            })
        }
    )
);

关于javascript - RXJS redux observable 执行多个 api 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52169232/

相关文章:

javascript - 是否有可能在 React 中实现类似 HOC 的类 - 没有类?

javascript - 在 ngOnInit 中设置输入值与在 angular .ts 文件中设置输入属性之间有任何性能或内存差异吗?

javascript - 将 json 数据转换为 javascript 数组

javascript - MyWebsite 如何发布 websiteA 和 websiteB 可以使用的 javascript 包 jQuery 或 AngularJS,而不会发生冲突?

javascript - 如何用内部对象构造对象

error-handling - 捕获并替换Rx可观察到的流/序列

Javascript getElementById 行为奇怪

javascript - 如何正确继承String内置类

angular - Firebase Angularfire2 - 监听已添加的查询列表子项

angular - 引用错误 : Rx is not defined