从 Promise 获取数据
Get data from a Promise
我正在使用 Tabletop.js 从我的 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 块中使用数组
编辑
使用 Keith 的代码片段,我的代码可以正常工作,并且还从 MDN site 添加了一个 reject
处理程序(在我的 getData() Promise 中)。
Promise.reject(new Error('fail')).then(function() {
// not called
}, function(error) {
console.log(error); // Stacktrace
});
唯一的问题是,我不明白我从 Promise.reject
得到的错误。它 returns 出现以下错误:
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)
你这里似乎有几个问题..
首先,您有 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
处理程序。
我正在使用 Tabletop.js 从我的 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 块中使用数组
编辑
使用 Keith 的代码片段,我的代码可以正常工作,并且还从 MDN site 添加了一个 reject
处理程序(在我的 getData() Promise 中)。
Promise.reject(new Error('fail')).then(function() {
// not called
}, function(error) {
console.log(error); // Stacktrace
});
唯一的问题是,我不明白我从 Promise.reject
得到的错误。它 returns 出现以下错误:
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)
你这里似乎有几个问题..
首先,您有 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
处理程序。