Backbone 收藏.创造与承诺

zzwlnbp8  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(123)

我目前正在实作采购单类型的检视。其中有PurchaseOrder数据表和PurchaseOrderLine数据表的项目。当使用者按下保存按钮时,我做的第一件事就是先储存采购单,然后撷取PurchaseOrderID并储存至每个个别的PurchaseOrder项目。问题如下:

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数据(我执行for循环以将请求ID插入到所有项中)。

我正在使用Promise,因为collection.fetch未在 Backbone.js 上返回Promise(我认为我的实现并不完全正确,因为Promise.resolve()用于使thenable成为一个承诺,而在本例中它不是)。问题是,当点击保存按钮时,thenpart传递,即使PurchaseOrder还没有创建。因此,当它到达PurchaseOrderLine.create时,所有项目都不使用PurchaseOrderID保存。我有两种选择:
1.为这个添加一个服务器验证。这样做的问题是每次都会返回一个错误,这可能会给用户带来麻烦。
1.添加一个setTimeout,至少等待几秒钟,以便在服务器上完成写入。
能不能请你对这个主题有所说明。

brc7rcf0

brc7rcf01#

你可以试试这样的

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做类似的事情。

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

相关问题