2016-08-10 3 views
0

Обратите внимание на следующую функцию ES6. Мое намерение - получить данные направления с карт Google. Функция карты google берет начало, место назначения, travelMode и обратный вызов в качестве параметров.Выход в генераторе обратного вызова не активирован

// Get direction data from Google API. Individual exports for testing 
 
export function* fetchDirections() { 
 
    const mapApiGoogle = yield select(selectMapApiGoogle()); 
 
    const google = mapApiGoogle.library; 
 
    const origin = yield select(selectOrigin()); 
 
    const destination = yield select(selectDestination()); 
 
    new google.maps.DirectionsService().route({ 
 
    origin: new google.maps.LatLng(origin.lat, origin.lng), 
 
    destination: new google.maps.LatLng(destination.lat, destination.lng), 
 
    travelMode: google.maps.TravelMode.DRIVING, 
 
    }, function* (result, status) { 
 
     if (status === google.maps.DirectionsStatus.OK) { 
 
     yield put(MapDirectionsRequestedGoogleSuccess(result)); 
 
     } else { 
 
     yield put(MapDirectionsRequestedGoogleError(result)); 
 
     } 
 
    } 
 
); 
 
} 
 

Проблема заключается в том, когда выполняется и обратный вызов с результатом называется функция DirectionService(). Маршрут(), мои fetchDirections() генератор не распознает выход в функции обратного вызова. Как мне изменить код выше, чтобы иметь возможность использовать доходность в функции обратного вызова?

ОБНОВЛЕНИЕ: Обычно я использую генератор в редукционной саге. Для целей тестирования я вызываю генератор, как показано ниже. Я просто понял, что генератор обратного вызова не получает экземпляр, поэтому внутренний доход никогда не будет достигнут. Вы знаете, как управлять внутренним генератором обратного вызова из fetchDirections() или как проверить результат?

describe('fetchDirections',() => { 
 
    let fetchSaga = false; 
 
    const googleStub = { 
 
    maps: { 
 
     LatLng: function (lat, lng) { 
 
     return { lat, lng } 
 
     }, 
 
     TravelMode: { 
 
     DRIVING: 'DRIVING' 
 
     }, 
 
     DirectionsStatus: { 
 
     OK: 'OK' 
 
     } 
 
    } 
 
    }; 
 
    beforeEach(() => { 
 
    fetchSaga = fetchDirections(); 
 
    const selectDescriptor = fetchSaga.next().value; 
 
    expect(selectDescriptor).toEqual(select(selectMapApiGoogle())); 
 
    }); 
 
    it('should invoke directions api',() => { 
 
    googleStub.maps.DirectionsService =() => { 
 
     return { 
 
     route: function(origin, destination, travelMode, callback) { 
 
      callback('directions','OK'); 
 
     } 
 
     } 
 
    }; 
 
    const putDescriptor = fetchSaga.next({ library: googleStub }).value; 
 
    expect(putDescriptor).toEqual(put(MapDirectionsRequestedGoogleSuccess('directions'))); 
 
    }); 
 
});

+0

Как вы используете свой генератор? Можете ли вы показать код, в котором вы его используете? – nils

+0

Для справки, я добавил раздел UPDATE – DsnKov

ответ

1

Функция * декларация (функция ключевого слова со звездочкой) определяет функцию генератора, который возвращает объект генератора.

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/function *

Сначала вы должны создать экземпляр функции генератора и получить обратно объект генератора от него. Поэтому я думаю, что обратный вызов не будет работать здесь, как вы ожидаете, он остановится после инициализации.

+0

, это хороший момент, в этом случае генератор обратного вызова не получит экземпляр. Как я должен контролировать обратный вызов, вызванный внешней библиотекой из генератора? – DsnKov

+0

Я должен, вероятно, преобразовать функцию обратного вызова в Promise. Осуществление в процессе. – DsnKov

+0

Да, обещайте эту часть 'new google.maps.DirectionsService(). Route ({...})' Тогда вы сможете получить разрешенное значение как генератор и работать с ним, как обычно. Его следует обрабатывать вне '* fetchDirections()'. – skymk

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