从承诺中获取数据

时间:2018-09-24 11:38:41

标签: javascript es6-promise tabletop.js

我正在与GIF Drawable一起从Google电子表格中获取数据。在函数中,我调用了Promise。唯一的问题是我无法从函数中获取数据(这是一个数组)。

我有以下代码:

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块中使用Array

修改 有了Keith的代码段,我的代码可以正常工作,并且还从Tabletop.js添加了一个reject处理程序(在getData()的承诺中)。

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 :(得分:0)

您这里似乎有几个问题。

首先,您有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处理程序。