将数据插入集合时出现Promises和代码超时问题



我正在尝试验证一个对象是否已经存在于wix集合中,以及它是否取消了对数据库的inset()调用

import wixData from "wix-data";
export function Memberships_beforeInsert(item, context) {
var name = item.firstName + item.lastName;
name = name.toLowerCase();
wixData.query(context.collectionName)
.find()
.then((res) => {
var members = res.items;
var len = res.length;
console.log(len)
for (var i = 0; i < len; i++) {
let member = members[i];
let memberName = member.firstName + member.lastName;
memberName = memberName.toLowerCase();
if (memberName === name) {
let toUpdate = {
'_id': member._id
}
wixData.update(context.collectionName, toUpdate)
return null;
}
return item;
}
});
//toHere    
}

我对wixCode还很陌生,但我本以为这要等到调用.then()后才能返回,如下所示,但由于wixCode使用了promise,代码会立即转到代码的//toHere部分,在该部分中它找不到返回并驳回调用。它将数据添加到数据库中,而不是返回null。

好的,所以当我们查看您的代码时,您似乎想找到一个与您试图插入到Membership的记录相匹配的记录,然后中止插入并执行更新(如果存在)。更好的方法是使用query.eq()函数查找特定的记录匹配。如果这找到了匹配的记录,则可以更新,否则继续插入。请参见下文。

这么快,什么是承诺?

用外行的话来说,把Promise想象成联邦快递的跟踪代码。

当你调用一个基于承诺的函数来要求它做某事时,你会得到一个承诺,即你要求的事情会得到完成,或者如果出现问题,你会被告知。

就像联邦快递公司的跟踪代码一样,除非你使用代码检查跟踪状态,或者联邦快递公司送货车到达并收到包裹,否则你不知道是否有东西到达(你的功能已经完成了你想要的任务)。此时,跟踪代码会更新为包裹已送达,您可能会收到一条短信或电子邮件,表示包裹已送达。

Promise函数要么成功完成,然后在函数调用中得到结果,要么如果发生错误,则触发catch()事件。所以所有基于Promise的函数都类似于if-then-else条件测试,只是它们看起来像这样:

sendFedEx(package) // Call doesn't resolve immediately you have to wait for fedEx!
.then((fedExDeliveryInfo) => {
//Your package arrived!
})
.catch((fedExLostPackageInfo) => {
//Your package got lost :-(
});

在代码中,您在数据集合之外进行不区分大小写的比较。这可能会随着大量数据收集而变得资源密集。更好的方法是存储不区分大小写的字符串:(item.firstName+item.lastName).toLowerCase(),然后使用.eq将其用于查询。这样,您就可以让数据收集完成任务并简化代码。注意:这利用了beforeInsert()返回Promise的事实。

语法

函数beforeInsert(项:Object,上下文:HookContext):Promise

这里有一个修改后的建议,有很多评论!

import wixData from "wix-data";
export function Memberships_beforeInsert(item, context) {
// Memberships_beforeInsert returns a promise. So does 
// wixData.query...find() so we simply return it to maintain the Promise
// chain.
var compareName = (item.firstName + item.lastName).toLowerCase();
// Add a compareName column value to item for future querying
// This will be inserted into the data collection
item.compareName = compareName;
//-------------------------------------------------------//
// This is the head of the Promise chain we need to return
//-------------------------------------------------------//
return wixData.query(context.collectionName)
.eq('compareName', item.compareName) // Query the compareName
.find()
.then((res) => {
var members = res.items;
var len = res.length;
console.log(len);
// Should only have one record or no records otherwise we have a
// problem with this code :-)
// So if we have too many we throw and error. This will be caught in
// an outer catch if we have one
if (len > 1) {
throw Error(`Internal Error! Too many records for ${item.firstName} ${item.lastName}`);
}
// If we get here we have a valid record OR we need to return a result
// To do this we will use a return variable set to the item which 
// assumes we will insert item. This will be overridden with the save
// Promise if we have a record already
var result = item;
if (len === 1) {
// We have a record already so we need to update it and return null
// to the caller of beforeInsert to halt the insert. This is a
// Simple case of adding the _id of the found record to the item we
// have been given.
item['_id'] = member._id;
// Again remember we are using promises so we need to return the
// wixData.update result which is a promise.
result = wixData.update(context.collectionName, toUpdate)
.then((savedRecord) => {
// Now we have chained the update to the beforeInsert response
// This is where we can tell the Insert function to abort by
// returning null.
return null;
});

}
// Now we can return the result we have determined to the caller
return result;
});    
}

这应该是你想要完成的事情。

相关内容

  • 没有找到相关文章

最新更新