2016-10-24 64 views
1

所以,我有一個困難時期試圖找出如何以下example轉換爲使用作爲傳奇它不是一個AJAX異步的相關問題:終極版 - 佐賀非Ajax相關回調問題

var dogBarkingBuffer = null; 
// Fix up prefixing 
window.AudioContext = window.AudioContext || window.webkitAudioContext; 
var context = new AudioContext(); 

function loadDogSound(url) { 
    var request = new XMLHttpRequest(); 
    request.open('GET', url, true); 
    request.responseType = 'arraybuffer'; 

    // Decode asynchronously 
    request.onload = function() { 
    context.decodeAudioData(request.response, function(buffer) { 
     dogBarkingBuffer = buffer; 
    }, onError); 
    } 
    request.send(); 
} 

我發現這個問題是不是相關XMLHttpRequest東西,而是如何應對decodeAudioData(data, callback)只有通過回調給你返回的數據,因此我想觸發動作,我沒有把它添加到我的終極版商店。

我的傳奇故事是這樣的時刻,但在decodeAudio前失蹤的產量似乎是一個問題:

import { takeLatest } from "redux-saga"; 
import { call, put } from "redux-saga/effects"; 
import axios from "axios"; 

import * as acts from "actions/playList"; 


const audioFileRequest = (url) => { 
    return axios.get(url, { 
    withCredentials: true, 
    responseType: "arraybuffer", 
    }) 
    .then(({ data }) => data) 
    .catch(({ error }) => error); 
}; 

const decodeAudio = (undecodedData, audioContext) => { 
    return audioContext.decodeAudioData(undecodedData, (buffer) => { 
    acts.recivedAudioFile(buffer); // no yeald ??? 
    }); 
}; 

function *fetchAudio({ url, audioContext }) { 
    try { 
    let rawAudioData = yield call(audioFileRequest, url); 
    decodeAudio(rawAudioData, audioContext); // no yield ??? 
    } 
    catch (error) { 
    yield put(acts.errorFetchingAudioFile(error)); 
    } 
} 

export function *watchFetchAudio() { 
    yield takeLatest(acts.AUDIO_FILE_REQUEST, fetchAudio); 
} 

回答

1

我認爲你可以使用ES6,承諾和使用終極版傳奇呼叫轉換器將音頻解碼功能方法。

const decodeAudio = ({rawAudioData, audioContext}) => { 
    return new Promise((resolve, reject) => { 
     audioContext.decodeAudioData(rawAudioData, (buffer) => { 
      resolve({buffer}); // or reject if failed 
     }); 
    }).then(({buffer}) => buffer).catch(error => error) 
}; 

function *fetchAudio({ url, audioContext }) { 
    try { 
     let rawAudioData = yield call(audioFileRequest, url); 
     let buffer = yield call(decodeAudio, {rawAudioData, audioContext}); 
     acts.recivedAudioFile(buffer); 
    } 
    catch (error) { 
     yield put(acts.errorFetchingAudioFile(error)); 
    } 
} 
+0

什麼時候出來後,我寫了這個,並認爲這是我自己。感謝您的快速回復! – CpILL

+0

乾杯.. :) @Cpill – Sohel