【问题标题】:Can't get return value from javascript function [duplicate]无法从javascript函数获取返回值[重复]
【发布时间】:2014-08-30 09:08:56
【问题描述】:

我不知道问题是什么。它不断返回一个空数组。也就是说,movieIds 始终为空。

function getMoviesInCinema(theCinema){
    var cinema = theCinema;
    var query = new Parse.Query("showing");
    var movieIds = [];

    query.equalTo("cinema", {
        __type: "Pointer",
        className: "Cinema",
        objectId: cinema
    });
    query.find().then(function(results) {
        if(results.length > 0){
            for (var i = 0; i < results.length; i++) {
                movieIds.push(results[i].get("movie"));
            }

        }
        else{
            console.log("Could be an error");
        }
    });
    return movieIds;

}

【问题讨论】:

    标签: javascript arrays parse-platform parse-cloud-code


    【解决方案1】:

    那是因为当你从函数返回时查询还没有完成。你应该让你的函数接受一个回调:

    function getMoviesInCinema(theCinema, callback){
        var cinema = theCinema;
        var query = new Parse.Query("showing");
    
        query.equalTo("cinema", {
            __type: "Pointer",
            className: "Cinema",
            objectId: cinema
        });
        query.find().then(function(results) {
            if(results.length > 0){
                callback(results);
            }
            else{
                console.log("Could be an error");
            }
        });
    }
    

    然后这样称呼它:

    getMoviesInCinema(theCinema, function(movieIds) {
    
        console.log(movieIds);
    
    });
    

    【讨论】:

    • 我需要查询的结果作为一个变量。 var 变量名 = 查询结果
    • @user3679294:你不能,至少不能让你立即有效地使用数组。同样,正如詹姆斯所说,您的函数返回之前信息可用。
    【解决方案2】:

    这里的问题是query.find()异步运行。这意味着您的getMoviesInCinema 函数在query.find 调用您的then 回调之前返回。

    因为query.find 是异步的,所以您的函数不能直接返回ID。 (它可以返回数组,但数组一开始是空的。)相反,它还应该提供 Promise 或允许回调。

    不确定你使用的是什么 Promises lib,所以这里是使用回调的选项:

    function getMoviesInCinema(theCinema, callback){
    // Receive the callback --------------^
        var cinema = theCinema;
        var query = new Parse.Query("showing");
        var movieIds = [];
    
        query.equalTo("cinema", {
            __type: "Pointer",
            className: "Cinema",
            objectId: cinema
        });
        query.find().then(function(results) {
            if(results.length > 0){
                for (var i = 0; i < results.length; i++) {
                    movieIds.push(results[i].get("movie"));
                }
    
            }
            else{
                console.log("Could be an error");
            }
            if (callback) {             // <=====
                callback(movieIds);     // <===== Call it
            }                           // <=====
        });
    }
    

    用法:

    getMoviesInCinema(42, function(movieIds) {
        // Use movieIds here
    });
    

    【讨论】:

      【解决方案3】:

      而不是使用

      movieIds.push(results[i].get("movie"));
      

      尝试使用

      movieIds.add(results[i].get("movie"));
      

      它可能会解决你的问题。

      【讨论】:

      • 你可以尝试打印“results[i].get("movie")" ...
      • 这比OP的原始代码更不正确,与实际问题无关。 .push 是在数组末尾添加内容的正确方法([].add 不存在)。
      • 还有 1 件事声明了全局范围内的 var movieIds ..
      • “还有 1 个东西在全局范围内声明 var movieIds” 这比答案更糟糕。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 2020-05-12
      • 2016-07-17
      • 2016-01-07
      • 1970-01-01
      • 2018-09-22
      • 1970-01-01
      相关资源
      最近更新 更多