2016-08-11 3 views
0

У меня есть определенные функции, что требует от меня, чтобы сделать один апи вызов, чтобы получить определенный идентификатор, который используется во втором апи вызова, логика мудрого это будет выглядеть следующим образом:Правильный способ вызова функции «шаг за шагом»

componentWillMount() { 
    this.props.functionOne() 

    // Wait for functionOne to complete before calling this 
    this.props.functionTwo(this.props.paramFromFunctionOne) 
} 

, где this.props.paramFromFunctionOne - это что-то, хранящееся в состоянии redux после выполнения одной функции.

+0

Я не использовал среагировать или Redux, но я уверен, что у них есть какой-то способ использовать посылы. Пробовали ли вы использовать реализацию обетованной библиотеки или даже собственные обещания? – zero298

+0

Что вы используете 'ajax' lib? – 1ven

+0

@ 1ven axios one – Ilja

ответ

2

Как я правильно понимаю, вы можете достичь его таким образом:

componentWillMount() { 
    // As `axios` returns promise, you should return it from `functionOne` 
    // This way you can be able to use `.then` method. 
    this.props.functionOne() 
    .then(() => { 
     // This code block would be executed after api call from first function will be finished. 
     this.props.functionTwo(this.props.paramFromFunctionOne) 
    }); 
} 
+0

Или еще лучше, что 'paramsFromFunctionOne' фактически является параметром в' then'. – styfle

+0

@styfle, да, это также возможно. – 1ven

2

Для этого вы можете использовать redux-saga. Сага Redux специально используется для вызова асинхронных функций и обработки побочных эффектов.

Например, вы можете указать значок загрузчика в пользовательском интерфейсе, в то время как данные извлекаются. И затем скройте значок загрузчика после получения данных. Вы можете написать преобразование этой асинхронной активности в синхронную с использованием Redux-саги.

Пример saga-

import { take, call, put, fork, cancel, race } from 'redux-saga/effects'; 
import { delay } from 'redux-saga'; 
import { LOCATION_CHANGE } from 'react-router-redux'; 
import { DATA_LOAD_REQUEST } from './constants'; 
import { dataLoadSuccess, dataLoadFailure } from './actions'; 

import request from 'utils/request'; //isomorphic-fetch 

export function* getCompanies() { 
    const requestURL = 'https://api.myjson.com/bins/32rap'; 
    const { companies, timeout } = yield race({ 
    companies: call(request, requestURL), 
    timeout: call(delay, 10000), 
    }); 

    if (companies) { 
    yield put(dataLoadSuccess(companies.data)); 
    } else if (timeout) { 
    yield put(dataLoadFailure()); 
    } else { 
    yield put(dataLoadFailure()); 
    } 
} 

export function* getCompaniesWatcher() { 
    while (yield take(DATA_LOAD_REQUEST)) { 
    yield call(getCompanies); 
    } 
} 

export function* companiesData() { 
    const watcher = yield fork(getCompaniesWatcher); 

    yield take(LOCATION_CHANGE); 
    yield cancel(watcher); 
} 

// All sagas to be loaded 
export default [ 
    companiesData, 
]; 

Вы можете найти эту ошеломляют, в первую очередь. Позвольте мне объяснить это пополам. Если вы проигнорируете шаблонную схему redux-saga, вы увидите, что этот код «выглядит» абсолютно синхронно!

расшифровки данного код-

  1. Отправки dataLoadRequest() в Redux магазин. (Чтобы показать загрузчик в пользовательском интерфейсе).

  2. Запросить данные для API.

  3. ручки тайм-аут (если данные не загружается в течение 10 секунд, отправка dataLoadFailure() действие на перевождь магазина.
  4. Если данные получены, отправка dataLoadSuccess() действие в магазин.

Перевождь-сага использует ES6 генератор функции. yield ключевого слово является часть функции генератора. function* означает, что она является функцией генератора, а не нормальная функция Javascript.

Надеется, что это помогает. Удаче!

+1

'вы можете видеть, что этот код абсолютно синхронный!' Это не так, он не блокирует очередь событий - намного лучше после редактирования :) Я просто не хотел, чтобы OP думал, что это было на самом деле действительно синхронно! – Alex

+1

@Alex Edited. Спасибо что подметил это. Я имел в виду, что сакт-релиз помогает нам писать асинхронный код в синхронном стиле. Нам не нужно использовать обратные вызовы или обещания. Код выглядит так, как будто мы пишем алгоритм на естественном языке. Надеюсь, вы получите суть ответа. – Mihir

Смежные вопросы