无法从React-Simple-Chatbot中的异步javascript调用访问外部函数中的值

时间:2018-01-21 14:50:44

标签: javascript asynchronous axios chatbot

我无法通过async调用将值返回到最外层函数。该对象是React-Simple-Chatbot的一个步骤的一部分,我试图使用验证器函数。它接受一个值,来自用户输入的string。我需要将true或string返回给验证器以使其工作。我无法弄清楚如何获取我的函数和/或回调以将数据返回给验证器。

    let p;
     {
        id: 'productTypes',
        user: true,
        validator: function(value) {
            response(value, this.id, function(answer){
                return p
            })
        },
        trigger: ({value}) => value.toLowerCase() === 'back' ? 'back' : 'productDetails'
    }


    function response(value, id, callback) {
            getData(value, id).then(x => p = x.data).then(x => callback(x))
    }

    function getData(value, id) {
           return axios.get('http://localhost:8085/chatbot', {params: {value: value, func: id }})
    }

我还尝试使用async/await解决此问题。这样做的问题是返回p的{​​{1}}的初始值为validate,但对undefined函数的后续调用有效。我不确定为什么validatereturn p之前运行。

response(value, this.id)

1 个答案:

答案 0 :(得分:0)

async/await模式不会return来自response函数调用的值,并且await调用response() validator()的结果let p; async function validator(value) { try { await response(value); console.log("validator:", {p}); } catch(err) { throw err } return p; } async function response(value, id) { try { let data = await getData(); p = data.data; } catch(err) { throw err } return p; } function getData(value, id) { return Promise.resolve({ data: 123 }) } validator() .then(value => { console.log("then:", {p}); // do `trigger` stuff with p }) .catch(err => console.error(err));

WriteTeams() {
    return teams_array.map(function(Teams, i){
        return(
        <View key={i}>
            <TouchableHighlight onPress={() =>
            this.props.navigation.navigate('TeamDetail')}>
                <Text>{Teams.TeamName}</Text>
            </TouchableHighlight>
        </View>
        );
    });
}
render(){
       <ScrollView>
           <View>
              <View>
                 {this.WriteTeams()}
              </View>
           </View>
       </ScrollView>
    }
}
const teams_array = [
  { TeamName: "Some team"},
  { TeamName: "Some team2"}
]