骨干收藏,创造和承诺

Backbone collection.create and promises

本文关键字:承诺 创造 收藏      更新时间:2023-09-26

我目前正在实现采购订单类型视图。我有一个采购订单表和一个采购订单表的项目。当用户按下保存按钮时,我做的第一件事是首先保存采购订单,然后检索 PurchaseOrderID 并保存到每个单独的采购订单项目。问题如下:

Promise.resolve( app.PurchaseOrder.create(formData) ).then(function(response){
                purchaseOrderID = response.collection.models[0].attributes.id;
                for(var key in formLineData){
                    if(formLineData.hasOwnProperty(key)){
                        formLineData[key]['requestID'] = purchaseOrderID;
                        app.PurchaseOrderLines.create(formLineData[key]);
                    }
                }
            }).catch(function(error){
                console.log(error);
            })

formData 是 PurchaseOrder 数据,formLineData 是 PurchaseOrderLine Data(我执行 for 循环以向所有项目插入请求 ID)。

我正在使用 Promise,因为

collection.fetch 不会在 Backbone 上返回承诺(我认为我的实现不太正确,因为 Promise.resolve() 用于做出承诺,在这种情况下它不是)。问题是,当单击保存按钮时,即使尚未创建PurchaseOrder,也会通过零件。因此,当它到达PurchaseOrderLine.create时,所有项目都会在没有PurchaseOrderID的情况下保存。我有两个选择:

  1. 为此添加服务器验证。这样做的问题是每次都会返回错误,这可能会给用户带来麻烦。

  2. 添加一个 setTimeout,以便至少等待几秒钟,以便在服务器上完成写入操作。

能否阐明这个话题。

你可以尝试这样的东西

app.PurchaseOrder.create(formData).then(function (response) {
  var purchaseOrderID = response.collection.models[0].attributes.id;
  return new Promise(async function (resolve) {
    for (var key in formLineData) {
      if (formLineData.hasOwnProperty(key)) {
        formLineData[key]["requestID"] = purchaseOrderID;
        await app.PurchaseOrderLines.create(formLineData[key]);
      }
    }
    resolve()
  });
});

或者也许使用 Promise.all 做这样的事情

Promise.all(formLineData.map(()=>app.PurchaseOrderLines.create(formLineData[key])))