收藏
回答

如何正确获得Promise方式后then返回值是值的本身而不是一个Promise对象?

我通过Promise方式把一个wx.request()的异步API封装好,示例代码大概如下:

getdata:function(){

return new Pormise(res,rej){

wx.request({

....

success:function(e){res(e.data)}, // e的值为一个对象{msgcode:1,data:1}

fail:function(error){rej("获取失败!")}

});

};

};

调用:

var value=getdata().then(function(e){

console.log(e); // 打印结果显示:1

return e; // 返回给变量value=Promise对象(情况如下图,isLike就是返回的Promise对象)

},function(error){});

请问为何我在上述的return e中获取不到跟打印console(e)同样的值?是哪里出错了?先感谢帮忙!

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

7 个回答

  • 微盟
    微盟
    2020-02-24

    getData: async function(){

      ....

      let url = "http://dddf.com/dd";

      let obj = await that.testAsync( 1, url, data{...} ,1);

      console.log(obj);

    },

    是不是会得到真实的值??

    2020-02-24
    有用 2
    回复 2
    • 大洪
      大洪
      2020-02-24
      是得到一个结构这样的值:
      Promise {<pending>}
      __proto__: Promise
      [[PromiseStatus]]: "resolved"
      [[PromiseValue]]: 1
      2020-02-24
      回复
    • 大洪
      大洪
      2020-02-24
      我想抽取这个1的值出来使用,有没有办法?
      2020-02-24
      回复
  • 阿东
    阿东
    2020-08-22
    将执行函数的外层函数加上asyncawait  默认返回的 Promise值就变成了我们要的默认返回值了  我试了 没问题
    
    bindinput:async function(e){
        var res = await app.oper(data)
        console.log(res)
        //外层函数不加async 还有执行对象不增加await 默认返回的res是一个Promise对象,这样套下去返回值就是我们要的正常数据了
    }
    
    


    2020-08-22
    有用 1
    回复 1
    • 薄伽梵
      薄伽梵
      10-21
      刚开始学,一直搞不懂语法规则,多谢
      10-21
      回复
  • 老张
    老张
    2020-02-24

    https://developers.weixin.qq.com/community/develop/article/doc/00028cbc2e04e0ddf549d535351c13

    参考一下。

    2020-02-24
    有用 1
    回复 16
    • 大洪
      大洪
      2020-02-24
      谢谢回复!我试了你的方法,返回的res也是一个Promise对象,我就是想返回里面的值直接赋值给一个可以供Promise函数其它外部使用,就老是没办法获取到这个值来用,看到也用不到
      2020-02-24
      回复
    • 老张
      老张
      2020-02-24回复大洪
      猜你是少写了一个async。
      2020-02-24
      回复
    • 大洪
      大洪
      2020-02-24
      我是这样按做的:按上边连接的内容提供的内容写了:
      // app.js 里编写以下代码:
      function promisify(api) {
        return (opt, ...arg) => {
          return new Promise((resolve, reject) => {
            api(Object.assign({}, opt, { success: resolve, fail: reject }), ...arg)
          })
        }
      }
      App({
        globalData: {},
        request: promisify(wx.request),
        onLaunch:function () {
        },
      })
      // 在应用页面index.js里定义了这个函数:
      testAsync: async function (type,url,data, id) {
          var res = await app.request({
            url: url,
            method: 'POST',
            data: data,
          })
          return res.data.data; // res.data.data = 1 (正常就是想获取这值 1 )
        },
      getData:function(){
        ....
        let url = "http://dddf.com/dd";
        let obj = that.testAsync( 1, url, data{...} ,1);
        console.log(obj); // obj=Promise对象,而不是=1
      },
      2020-02-24
      1
      回复
    • 大洪
      大洪
      2020-02-24
      上边obj的返回结果如下图:
      2020-02-24
      回复
    • 老张
      老张
      2020-02-24回复大洪
      试试改成:getData: async function()和 let obj = await that.testAsync()
      2020-02-24
      回复
    查看更多(11)
  • SMile~~
    SMile~~
    2020-09-11

    我遇到了类似的问题怎么拿到数据并且改变这个eduTopicStores值

    2020-09-11
    有用
    回复
  • 陈勇为
    陈勇为
    2020-05-15

    承诺对象系统为了保持链式操作,then返回的总是另一个promise,then源码中最后是return result.promise;,所传入的回调的返回值也只是被传入了result.resolve()中。

    因此除非改then方法或添加方法(但关系到值的获得以及context),不然不能改变返回值。

    我觉得倒不如将value的赋值放在then的回调里面好些。

    2020-05-15
    有用
    回复
  • 华子
    华子
    2020-03-25

    请问楼主解决了么?我已经卡在这一整天啦?如果有其他解决办法的话能不能回复一下呢?谢谢谢谢!

    2020-03-25
    有用
    回复 11
    • 大洪
      大洪
      2020-03-25
      你的是什么问题?能说说看?我基本是解决了
      2020-03-25
      回复
    • Unplug
      Unplug
      2020-04-06回复大洪
      哪个promise里面的数值没办法取出来么,我也弄不出来
      2020-04-06
      回复
    • 大洪
      大洪
      2020-04-06回复Unplug
      可以取了,而且也完全明白怎样使用了!你的问题是如何,能放上来我看看,应该可以帮助你解决一下。
      2020-04-06
      1
      回复
    • Unplug
      Unplug
      2020-04-06回复大洪
      我的跟你一样,在then里面可以打印,但是不能赋值,赋值后再打印就是空
      2020-04-06
      回复
    • 大洪
      大洪
      2020-04-06回复Unplug
      你直接在then里赋值给变量即可,离开then以后,then里赋值的变量或then里本来传出的值都无法打印的(这点是好肯定),但你赋值的变量其实是已有值了。只是打印时显示不出来而已。只要你在then内把值通过setData()方法赋给指定的变量即可。
      2020-04-06
      回复
    查看更多(6)
  • 金煜峰
    金煜峰
    2020-02-24

    getdata 的返回值就是 Promise,then 中返回是没有用的(只是在 Promise 执行完成时调用一下,返回值没有意义),只能在 then 回调中使用结果

    要变成同步的写法只能用 async await

    async function(){
      var value = await getdata();
    }
    


    2020-02-24
    有用
    回复 1
    • 大洪
      大洪
      2020-02-24
      变成同步后,还是不能正常赋值给变量出来一个值,而不是一个Promise对象
      2020-02-24
      回复
登录 后发表内容
问题标签