【问题标题】:Return array inside promise is returning undefined承诺中的返回数组返回未定义
【发布时间】:2019-07-30 18:13:42
【问题描述】:

我正在学习 NodeJS 来做一些自动化脚本,但是我遇到了一个我不知道如何解决的问题。

使用 google 电子表格 API 和“promisify-node”包,我从电子表格请求一些数据,并尝试返回部分数据以用于另一个 js 文件。

文件:电子表格.js

const getProductsConfiguration = async(auth) => 
{
    const sheets = google.sheets('v4');
    const getValues = promisify(sheets.spreadsheets.values.get);
    await getValues({
        auth: auth,
        spreadsheetId: utils.getSpreadsheedId(config.spreadsheet.configSpreadsheedUrl),
        range: `${config.spreadsheet.configTabName}!A8:C1000`,   
    })
    .then(function (response) {
        var productsConfiguration = [];
        for(var value in response.values)
        {
            if(response.values[value].length === 0) continue;
            var productConfig = {
                "productName": response.values[value][0],
                "spreadsheetId": response.values[value][1],
                "filterId": response.values[value][2]
            };
            productsConfiguration.push(productConfig);
        }
        console.log(productsConfiguration);
        return productsConfiguration;
    })
    .catch(function (error){console.log(error); return false;});
};

app.js:

productsConfig = await spreadsheet.getProductsConfiguration(sheetAuth);
        console.log(productsConfig);

此 console.log 正在返回“未定义”,但“spreadsheet.js”中的 console.log 正在返回正确的数据。

我能做些什么来解决?谢谢

【问题讨论】:

标签: javascript arrays node.js promise


【解决方案1】:

你可以只做const values = await getValues({...})。不需要在它之后放一个then,因为当你在一个返回promise的函数前面使用await时,promise会解析为值。

const getProductsConfiguration = async(auth) => {
    const sheets = google.sheets('v4');
    const getValues = promisify(sheets.spreadsheets.values.get);
    let values
    try{
        values = await getValues({
            auth: auth,
            spreadsheetId: utils.getSpreadsheedId(config.spreadsheet.configSpreadsheedUrl),
            range: `${config.spreadsheet.configTabName}!A8:C1000`,   
        })
    }catch(e){
        console.log(error)
    }

    var productsConfiguration = [];
    if(values){
        for(var value in values) {
            if(values[value].length === 0) continue;
            var productConfig = {
                "productName": values[value][0],
                "spreadsheetId": values[value][1],
                "filterId": values[value][2]
            };
            productsConfiguration.push(productConfig);
        }
    }

    console.log(productsConfiguration);
    return productsConfiguration
};

希望这会有所帮助!

【讨论】:

  • 好吧,我或多或少地按照你说的做了,它奏效了:D 谢谢你.. 所以,再问一个问题。每次我想在 Promise 中返回一个值,我需要将整个 Promise 存储在一个变量中,然后返回这个变量?谢谢!
  • 一个承诺返回一个承诺。即使你从一个承诺中返回一个值,它返回的也是一个承诺......这就是为什么你可以调用它的原因。但是在async function 内的promise 前面使用await,会将promise 解析为值。
猜你喜欢
  • 1970-01-01
  • 2021-07-07
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
相关资源
最近更新 更多