如何从 Javascript (Wix Velo) 查询函数返回数组

问题描述 投票:0回答:1

我是 Javascript 新手,无法理解异步函数(特别是查询函数)。我下面有一个有效的查询,但需要将该查询的结果作为数组返回。

const allComedians = "Comedians";
let shows = ["Heat 1","Heat 2","Heat 3","Heat 4","Heat 5","Showcase 1","Showcase 2","Showcase 3"];
let showKeys = ["1","2","3","4","5","6","7","8"];
let ActiveComedians = [];

function initialize () {
    for (let x = 0; x < shows.length; x++){
        if (project.title === shows[x]){
            wixData.query(allComedians).contains("showKey", showKeys[x])
                .eq("isActive", true)
                .find()
                .then((results) => {
                    for (let i = 0; i < results.items.length; i++){
                        let add = results.items[i].title.trim();
                        ActiveComedians.push(add);
                    }
             })
             .catch((err) => {
             console.log(err);
             })
             return ActiveComedians;
         }
    }
}

预先感谢您能够提供的任何说明。

上面的代码运行所需的查询并提供预期的结果,但我无法访问数组 ActiveComedians 的内容,因为直到脚本的所有其他部分执行后它才会返回。

javascript asynchronous async-await velo
1个回答
0
投票

在 JavaScript 中,异步函数不会立即返回。

当您的函数继续执行时,查询将继续在后台运行,导致 ActiveComedians 在填充之前被返回。

要解决此问题,您需要使用

.then()
等待查询完成。这是代码的简化版本:

const allComedians = "Comedians";
let shows = [
  "Heat 1",
  "Heat 2",
  "Heat 3",
  "Heat 4",
  "Heat 5",
  "Showcase 1",
  "Showcase 2",
  "Showcase 3",
];
let showKeys = ["1", "2", "3", "4", "5", "6", "7", "8"];
let ActiveComedians = [];

function initialize() {
  for (let x = 0; x < shows.length; x++) {
    if (project.title === shows[x]) {
      return wixData
        .query(allComedians)
        .contains("showKey", showKeys[x])
        .eq("isActive", true)
        .find()
        .then((results) => {
          for (let i = 0; i < results.items.length; i++) {
            let add = results.items[i].title.trim();
            ActiveComedians.push(add);
          }
          return ActiveComedians; // Return after query finishes
        })
        .catch((err) => {
          console.log(err);
        });
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.