我通过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)同样的值?是哪里出错了?先感谢帮忙!
getData: async function(){
....
let url = "http://dddf.com/dd";
let obj = await that.testAsync( 1, url, data{...} ,1);
console.log(obj);
},
是不是会得到真实的值??
Promise {<pending>}
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: 1
将执行函数的外层函数加上async 和await 默认返回的 Promise值就变成了我们要的默认返回值了 我试了 没问题 bindinput:async function(e){ var res = await app.oper(data) console.log(res) //外层函数不加async 还有执行对象不增加await 默认返回的res是一个Promise对象,这样套下去返回值就是我们要的正常数据了 }
https://developers.weixin.qq.com/community/develop/article/doc/00028cbc2e04e0ddf549d535351c13
参考一下。
// 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
},
我遇到了类似的问题怎么拿到数据并且改变这个eduTopicStores值
承诺对象系统为了保持链式操作,then返回的总是另一个promise,then源码中最后是return result.promise;,所传入的回调的返回值也只是被传入了result.resolve()中。
因此除非改then方法或添加方法(但关系到值的获得以及context),不然不能改变返回值。
我觉得倒不如将value的赋值放在then的回调里面好些。
请问楼主解决了么?我已经卡在这一整天啦?如果有其他解决办法的话能不能回复一下呢?谢谢谢谢!
getdata 的返回值就是 Promise,then 中返回是没有用的(只是在 Promise 执行完成时调用一下,返回值没有意义),只能在 then 回调中使用结果
要变成同步的写法只能用 async await
async function(){ var value = await getdata(); }