Получить данные из Обещания - PullRequest
       51

Получить данные из Обещания

0 голосов
/ 24 сентября 2018

Я работаю с Tabletop.js , чтобы получить данные из моей таблицы Google.В функции я вызвал Обещание.Единственная проблема в том, что я не могу получить данные (которые являются массивом) из функции.

У меня есть следующий код:

function getData() {

  return new Promise((resolve) => {
    Tabletop.init({key: publicSpreadsheetUrl, callback: showInfo, simpleSheet: true})
    resolve('Done');
  })
}

let arrayWithData = [];

function showInfo (data, tabletop) {
  console.log('showInfo active');
  arrayWithData.push(...data);
  return new Promise(resolve => {
    console.log(arrayWithData, 'data is here')
    resolve(arrayWithData) // This doesn't work yet
  })
}
 showInfo().then(data => {
   console.log(data, 'data from the Promise')
 }) // This doesn't work

Я хочу использовать массив позжев блоках React

Редактировать С помощью фрагмента кода Кейта мой код работает, а также добавлен обработчик reject (внутри моего обещания getData ()) из MDN site .

Promise.reject(new Error('fail')).then(function() {
  // not called
}, function(error) {
   console.log(error); // Stacktrace
});

Единственное, что я не понимаю ошибку, которую я получаю от моего Promise.reject.Возвращает следующую ошибку:

Error: fail
at eval (eval at hmrApply (base.eaab6c8c.js:297), <anonymous>:37:20)
at new Promise (<anonymous>)
at getData (eval at hmrApply (base.eaab6c8c.js:297), <anonymous>:30:10)
at Object.eval (eval at hmrApply (base.eaab6c8c.js:297), <anonymous>:63:1)
at newRequire (script.726c79f3.js:48)
at hmrAccept (base.eaab6c8c.js:328)
at base.eaab6c8c.js:214
at Array.forEach (<anonymous>)
at WebSocket.ws.onmessage (base.eaab6c8c.js:212)

1 Ответ

0 голосов
/ 24 сентября 2018

У вас, похоже, есть несколько проблем здесь ...

Во-первых, у вас есть showInfo().then, я уверен, что вы хотели это сделать -> getData().then(

Ваш следующийпроблема в вашей функции getData.как @ChrisG сказал, что вы просто тут же выполняете обещание, ниже приведено более вероятное, что вы хотели сделать.

function getData() {
  return new Promise((resolve) => {
    Tabletop.init({key: publicSpreadsheetUrl, 
      callback: function (data, tabletop) { resolve(showInfo(data, tabletop)); },
      simpleSheet: true})
  })
}

Наконец, ваше showInfo ничего не делает async, поэтому его можно упростить до ->

function showInfo (data, tabletop) {
  console.log('showInfo active');
  arrayWithData.push(...data);
  console.log(arrayWithData, 'data is here')
  return arrayWithData;
}

И последнее: здесь нет проверки ошибок, обычно обратные вызовы имеют какой-то способ информировать вас о состоянии ошибки, затем вы также можете добавить обработчик reject.

...