收藏
回答

请问函数调用时,由于异步问题不能获取值,该怎么处理呢?

各位前辈,现在需要在页面里去调用外部函数,来获取云开发数据库里的数据,但返回值总是undefined,该怎么处理呢?程序附在后面。

调用的函数里console是有值的,但在page里返回值总是undefined。在同一页面里会用 promise 来写,这种不在同一页面的调用不知该咋搞了?拜托赐教。

////////////////page///////////

var getPrice = require("../../../rsc/js/get_price.js");

Page({

let test = getPrice.test(record_id, '2019-12-10');

console.log("函数调用回传值,test::", test);    //这里打印出来值是 undefined,还没等调用的函数去到值,这里就先给出了结果,咋搞?

})

////////////////外部函数///////////

const db = wx.cloud.database()

const test = (record_id, date) => {

var result = {};

db.collection('host_info').where({ //查询是否有记录

_id: record_id,

'weekend_set.chosen_dates': date

}).count().then(res => {

if (res.total > 0) //如果查到符合要求的条目,则获取下面数据并返回值

{

db.collection('host_info').where({

_id: record_id,

})

.get().then(res1 => {

result = res1.data[0].weekend_set;

})

return result;

} else   //如果没查到符合要求的条目,则获取下面数据并返回值

{

db.collection('host_info').where({

_id: hotel_id,

})

.get().then(res2 => {

result = res2.data[0].normal_set;

})

return result;

}

})

}

module.exports = { test: test,}

回答关注问题邀请回答
收藏

3 个回答

  • o0o有脾气的酸奶
    o0o有脾气的酸奶
    2019-10-22

    const test = async (record_id, date) => {

        var result = {},res,res1,res2

        res = await db.collection('host_info').where({

            _id: record_id,

            'weekend_set.chosen_dates': date

        }).count()

        if(res.total > 0){

            res1 = await db.collection('host_info').where({

            _id: record_id,

            }).get()

            result = res1.data[0].weekend_set;

        } else {

            res2 = await db.collection('host_info').where({

            _id: hotel_id,

            }).get()

            result = res2.data[0].normal_set

        }

        return result

    }



    2019-10-22
    赞同 1
    回复 6
    • low B
      low B
      2019-10-22
      老大,感谢。我马上试下。原来只有C语音的基础,边干边学,逻辑这些还好,对JS的运行机制这些没有概念,对回调、promise这些糊里糊涂的。
      2019-10-22
      回复
    • low B
      low B
      2019-10-22
      刚试了,执行 async await 时报错:Uncaught ReferenceError: regeneratorRuntime is not defined。我选了es6转es5的,这里应该还要处理一下。我再看看
      2019-10-22
      回复
    • 金煜峰
      金煜峰
      2019-10-22回复low B
      使用async和await要把增强编译勾上
      2019-10-22
      1
      回复
    • low B
      low B
      2019-10-22
      确实,勾上增强编译果然不报错了。现在在页面打印出来的结果是 Promise {pending},应该还有点小问题
      2019-10-22
      回复
    • 金煜峰
      金煜峰
      2019-10-22回复low B
      在.then里面打印(或者用await),不要直接打印函数结果,异步函数返回的是Promise
      2019-10-22
      1
      回复
    查看更多(1)
  • 老张
    老张
    2019-10-23

    不要勾es6转es5,基础库选高版本的,不用勾增强编译,可以直接用async/await.

    2019-10-23
    赞同
    回复 3
    • low B
      low B
      2019-10-23
      程序已经写了很多了,原来是勾了es6转es5的,现在不勾一大堆错误,一般是什么原因呢?
      2019-10-23
      回复
    • 老张
      老张
      2019-10-23回复low B
      用了第三方的库,它们用的是es5
      2019-10-23
      回复
    • low B
      low B
      2019-10-23
      是用了第三方的,现在不好改了,不过还好,用上面这位兄台的办法也可以直接使用async/await。
      2019-10-23
      回复
  • 金煜峰
    金煜峰
    2019-10-22
    const test = (record_id, date) => {
      return new Promise(function(resolve,reject)){
         ......
        resolve(result);
      }
    }


    getPrice.test(record_id, '2019-12-10').then(function(result){
      let test = result
    })


    2019-10-22
    赞同
    回复 4
    • low B
      low B
      2019-10-22
      感谢回复,刚试了一下,还是没能获取到值。是不是因为我在调用的函数里嵌套了两个异步操作,先去数据库查找字段,根据查找结果再去数据库取值,这种嵌套异步操作是不是用最外层一个promise搞不定呢?我接触小程序不久,对promise一直云里雾里的,多谢指导
      2019-10-22
      回复
    • 金煜峰
      金煜峰
      2019-10-22回复low B
      应该没问题的,resolve放对位置了吗(得到最后results再执行),另外是在then回调里打印了吗
      2019-10-22
      1
      回复
    • low B
      low B
      2019-10-22回复金煜峰
      我再试试
      2019-10-22
      回复
    • low B
      low B
      2019-10-23回复金煜峰
      应该是原来resolve没放对位置,现在可以获取到值了,非常感谢。
      2019-10-23
      回复
登录 后发表内容
问题标签