Неожиданное обещание в React Native - PullRequest
0 голосов
/ 25 февраля 2019

Я новичок в React Native и кодировании в целом.Я заплатил за некоторый код в процессе работы и мне трудно интегрировать его в мою программу.

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 () программа возвращает массив из трех обещаний.(Я также запустил код с «await» перед pullBatch (), но он выдает ошибку, сообщая, что await - зарезервированное слово) Это означает, что я делаю две ошибки:

  1. Я не правильнопонимание обещаний в JS или как они разрешаются.
  2. Я неправильно конкатенирую массивы.

Я постоянно пытаюсь учиться, поэтому, хотя я очень ценю предложения по исправлению кода, яЯ также был бы признателен, если бы вы научили меня, где лежат мои ошибки в понимании.

Спасибо

1 Ответ

0 голосов
/ 25 февраля 2019

Давайте разберемся.Похоже, вы понимаете, что pullBatch - это асинхронная функция, и поэтому ее вызов вернет обещание, созданное взаимодействием twitterRest.

Проблема в том, что ваш вызов pullBatch внутри цикла for не разрешитсяэти обещания (что, кажется, то, что вы хотите сделать).Самый простой способ - использовать await для currentBatch, но, как вы пытались, вы получили зарезервированную ошибку.По сути, вам просто нужно сделать pullTimeline асинхронным следующим образом:

async pullTimeline(){
  ...

Просто поймите, что когда вы это сделаете, pullTimeline теперь является асинхронной функцией, которая также будет возвращать обещание.Поэтому, чтобы использовать эту функцию, вам нужно либо использовать .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 вокруг любого из ваших ожидающих вызовов.

...