微信官方云原生开发平台,腾讯云的各种能力加持,用云开发开发者可以节省大量的开发时间和运维成本。
无需运维,数据变大不需要管理,
弹性伸缩,业务量变大,服务器的性能也会弹性伸缩。
数据安全:独立的环境
云函数:云函数=小程序后端
云数据库:json数据库
云存储:文件上传下载
云调用:调用腾讯云的开放接口
HTTP API:原有的项目和云开发小程序打通
点击微信开发者工具上面的云开发,然后配置环境。
在app.json中输入页面的路径。
“pages/playlist/playlist”,
“pages/blog/blog”,
“pages/profile/profile”
同时在文件目录中会自动生成文件夹。
<swiper indicator-dots="true" autoplay="true" interval="4000" duration="2000">
<block wx:for="{{urlList}}">
<swiper-item>
<image src="" mode="widthFit"></image>
</swiper-item>
</block>
</swiper>
组件:在用户界面开发领域,组件是一种面向用户的、独立的、可复用的交互元素的封装。
组件化开发的意义:
项目中多处都是需要组建开发的。
也正是因为这样,我们常常会说: JavaScript 是由事件驱动的
现在我们有个需求,a文件读完了再读b,b读完了再读c:
我们可以这样写:
fs.readFile('a.txt','utf8',function(error,data){
if(error){
return console.log('读取数据失败!');
}
console.log('a');
fs.readFile('b.txt','utf8',function(error,data){
if(error){
return console.log('读取数据失败!');
}
console.log('b');
fs.readFile('c.txt','utf8',function(error,data){
if(error){
return console.log('读取数据失败!');
}
console.log('c');
});
});
});
这样就保证了 a 读取完在读 b,b读取完在读 c 了
上面这种代码的书写方式其实就是 回调地狱,一层套一层,维护起来及其困难,如果有100个文件怎么办?
使用 Promise 解决回调地狱问题
new Promise((resolve, reject) => {
setTimeout(() => {
console.log(1)
resolve()//执行成功之后要执行的
}, 1000)
}).then((res)=>{
setTimeout(() => {
console.log(2)
}, 2000);
})
一、Promise.all 场景,上传完所有图片返回文件ID之后再保存
let p2=new Promise((resolve,reject)=>{
setTimeout(() => {
console.log('p2')
resolve('p2')
}, 1000);
})
let p1=new Promise((resolve,reject)=>{
setTimeout(() => {
console.log('p1')
// resolve('p1')
reject('p1')
}, 2000);
})
let p3=new Promise((resolve,reject)=>{
setTimeout(() => {
console.log('p3')
resolve('p3')
}, 3000);
})
Promise.all([p1,p2,p3]).then((res)=>{
console.log('全部完成')
console.log(res)
}).catch((err)=>{
console.log('失败')
console.log(err)
})
全部执行成功输出
p2
p1
p3
全部完成
[“p1”, “p2”, “p3”]
p1执行失败输出
p2
p1
失败
p1
p3
Promise.all中,只要有一个任务是失败的,整个任务就都是失败的,但它并不会阻止其他任务的执行
== demo.js? [sm]:57 p1 表示在代码的57行输出p1==
二、Promise.race 比赛、竞赛,场景,可以判断请求是否超时
Promise.race([p1,p2,p3]).then((res)=>{
console.log('完成')
console.log(res)
}).catch((err)=>{
console.log('失败')
console.log(err)
})
按照上面的方法执行之后,输出:
p2
完成
p2
p1
p3
在onLoad方法中调用foo方法
async foo(){
console.log('foo')
let res = await this.timeout()
console.log(res)
},
timeout(){
return new Promise((resolve,reject)=>{
setTimeout(() => {
console.log(1)
resolve('resolved')
}, 1000);
})
}
输出结果:
foo
1
resolved
只要有一个任务是完成的,最后的结果就是完成的,也不会影响其他任务继续执行
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
}) // 使用当前云环境
const db = cloud.database() //数据库的初始化
const rp = require('request-promise')//引入需要的包
const URL = 'http://musicapi.xiecheng.live/personalized'
// 云函数入口函数
exports.main = async (event, context) => {
//通过request- promise请求对应的URL
const playlist = await rp(URL).then((res) => {
return JSON.parse(res).content
})
//db.serverDate获取服务器时间
//...playlist[i]获取到playlist的每一个值 ...表示扩展运算符
for (let i = 0, len = playlist.length; i < len; i++) {
await db.collection('playlist').add({
data: {
...playlist[i],
createTime: db.serverDate(),
}
}).then((res) => {
console.log('插入成功')
}).catch((err) => {
console.error('插入失败')
})
}
}
const list=await memListCollection.get()
return {
length:list.data.length
}
解决方案
获取总条数,然后根据每次取的条数(最大为100条)分批次取,类似分页取数据。使用limit函数进行获取。
const MAX_LIMIT=100
const total=await memListCollection.count().total//获取总条数
const batchTimes=Math.ceil(total/MAX_LIMIT)//向上取整
const tasks=[]
for(let i=0;i<batchTimes;i++){
let promise=memListCollection.skip(i*MAX_LIMIT).limit(MAX_LIMIT).get()
tasks.push(promise)
}
let list={
data:[]
}
if(tasks.length>0){
//reduce 表示累加操作,previousValue,currentValue
list = (await Promise.all(tasks)).reduce((acc,cur)=>{
return{
data:acc.data.concat(cur.data)
}
})
}
在此云函数中的config.json文件中进行配置
此触发器表示的是每天的10,14,16,23点执行此云函数。
{
"triggers":[
{
"name":"myTrigger",
"type":"timer",
"config":"0 0 10,14,16,23 * * * *"
}
]
}
配置完成之后在该云函数上右键然后点击上传云函数。
有的一些云函数的执行时间比较长,或者是因为网络的原因,执行的比较慢,可以在云函数中配置超时时间。防止因为超时时间设置的比较短而出现错误。