React Native 中的意外 Promise

Posted

技术标签:

【中文标题】React Native 中的意外 Promise【英文标题】:Unexpected Promise in React Native 【发布时间】:2019-07-18 10:42:02 【问题描述】:

我是 React Native 和一般编码的新手。我在 upwork 上支付了一些代码,并且很难将其集成到我的程序中。

async pullBatch(since)
    let param = 
        userScreenName: '?screen_name=google',
        count: "&count=5",
        retweets: "&include_rts=false",
        replies: "&exclude_replies=false",
        trim: "&trim_user=true",
        since: "&max_id=" + since
    ;

    let twitterRest = new TwitterRest(); //create a new instance of TwitterRest Class   
    let batch = await twitterRest.pullTweets(param); //pull the Google TimeLine
    return batch;


pullTimeline()
    let timeLine = []
    for(i = 0; i <= 2; i++)
        let currentBatch = this.pullBatch("1098740934588751900")
        console.log(currentBatch);
        timeLine = timeLine.concat(currentBatch);
    
    console.log(timeLine);
    // timeLine = currentBatch
    return(timeLine)

我相信在运行 pullTimeLine() 时,程序会返回一个包含三个 Promise 的数组。 (我也在 pullBatch() 之前用“await”运行了代码,但是告诉我 await 是一个保留字会出错)这意味着我犯了两个错误:

    我没有正确理解 JS 中的 promise 或它们是如何解决的。 我错误地连接了数组。

我一直在努力学习,所以虽然我非常感谢有关代码修复的建议,但如果您能告诉我我在理解方面的失误在哪里,我也非常感激。

谢谢

【问题讨论】:

【参考方案1】:

让我们分解一下。您似乎明白 pullBatch 是一个异步函数,因此调用它会返回一个由 twitterRest 交互创建的 Promise。

问题是您在 for 循环中对 pullBatch 的调用不会解决这些承诺(这似乎是您想要做的)。最简单的方法是将await 用于currentBatch,但是当您尝试时,您得到了保留的错误。基本上你只需要像这样使pullTimeline异步:

async pullTimeline()
  ...

只要意识到,一旦你这样做了,pullTimeline 现在是一个异步函数,它也会返回一个 Promise。所以要使用这个功能你需要要么使用.then(),例如:

pullTimeline().then(timeLine => 
  // do something with your timeline here
)

或者如果你在另一个异步函数中使用它,你可以使用 await。

const timeLine = await pullTimeline() // must be inside async function

基本上在调用链中的某个时刻,您必须使用.then() 解决承诺,或者通过创建***异步函数来忽略***承诺。例如:

async useTimeline() 
  const timeLine = await pullTimeline()
  // do something with your timeline


// call the function above, and just disregard its promise
useTimeLine()

只是不要忘记在某处处理错误。在您的***承诺中使用.catch(),或者在您的任何等待调用中使用try / catch

【讨论】:

这样一个深思熟虑和有益的回应。非常感谢。接受了你的建议,经过一些修补(比我自豪地承认的更多的猜测和检查),我让事情运行起来了。再次感谢

以上是关于React Native 中的意外 Promise的主要内容,如果未能解决你的问题,请参考以下文章

使用 redux-thunk 从 React Native 中的动作创建者返回 Promise

使用React Native Fetch中的对象响应时未处理的Promise Rejection

如何在 react-native 中处理 promise

React Native - 意外的标识符

意外的导入令牌 - 使用 Jest 测试 React Native

React Native AsyncStorage:从 Promise 对象访问值