【问题标题】:Backbone collection.create and promises骨干collection.create 和promises
【发布时间】:2016-06-11 04:16:57
【问题描述】:

我目前正在实施采购订单类型视图。我有一个 PurchaseOrder 表和一个 PurchaseOrderLine 表的项目。当用户按下 save 按钮时,我要做的第一件事是先保存采购订单,然后检索 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 插入所有项目)。

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

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

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

能否介绍一下这个话题。

【问题讨论】:

  • 如果即使在 create 中的 ajax 调用未完成时 then() 也会触发,我建议 app.PurchaseOrder.create() 不返回承诺。非 Promise 对象被视为已解决。
  • fetch 确实返回了一个承诺对象。 stackoverflow.com/questions/22967191/…
  • 我没有使用 fetch,它的 create
  • 首先您应该edit 并更新您的问题以澄清您的问题与fetch 无关。 create 立即返回创建的模型。如果您想等待服务器直到将创建的模型添加到集合中然后执行某些操作,请传递 {wait: true}
  • 已经更正了问题。

标签: javascript jquery backbone.js promise


【解决方案1】:

你可以试试这样的

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多