Backbone collection.create和promises

时间:2016-02-28 00:37:28

标签: javascript jquery backbone.js promise

我目前正在实施采购订单类型视图。我有一个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 循环以将requestID插入所有项目。)< / p>

我正在使用Promise,因为collection.fetch不会在Backbone上返回一个承诺(我认为我的实现并不完全正确,因为Promise.resolve()用于使thenables成为一个承诺,在这种情况下它是&n& #39; T)。问题是,当单击保存按钮时,然后部分通过甚至还没有创建PurchaseOrder。因此,当它到达PurchaseOrderLine.create时,所有项目都保存在没有PurchaseOrderID的情况下。我有两个选择:

  1. 为此添加服务器验证。这个问题是每次都会返回一个错误,这对用户来说可能很麻烦。

  2. 添加setTimeout至少等待几秒钟,以便在服务器上进行写入。

  3. 请说明这个话题。

1 个答案:

答案 0 :(得分:0)

你可以试试这样的

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])))