【问题标题】:How to make .then completely finish before moving onto the next?如何在进入下一个之前完全完成?
【发布时间】:2020-03-28 08:42:57
【问题描述】:

所以,我要在数据库中添加一个机构,然后在数据库中添加一个特殊的。一个机构可以有一对多特价,所以我试图在第三个.then() 下创建一个关系。问题是,然后第 3 个.then() 在建立之前执行,并将特殊添加到数据库中。我需要先将建立和特殊添加到数据库中,因为我需要获取它们的objectIds,var establishmentObjectId;var specialObjectId;

如何确保在建立关系之前检索到建立和特殊 objectId?

    //Save the establishment objectId
    var establishmentObjectId;
    //Save the special objectID
    var specialObjectId;

    //Save establishment
    .then(() => {
        //Get the add form data
        var addName = document.getElementById('add_name');
        var addCountry = document.getElementById('add_country');
        var addEstablishmentType = document.getElementById('add_establishment_type');
        var addCuisineType = document.getElementById('add_cusine_type');

        //Create establishment from user's enteries
        var establishment = {
            Name: addName.value,
            Address: addAddress.value,
            Suburb: addSuburb.value,
            Country: addCountry.value,
            Cuisine_Type: addCuisineType.value,
            Establishment_Type: addEstablishmentType.value
        }

        //Save establishment to db
        Backendless.Data.of('Establishment').save( establishment )
        .then( function( savedObject ) {
            establishmentObjectId = savedObject.objectId;
            console.log( "new Establishment instance has been saved" );
          })
        .catch( function( error ) {
            console.log( "an error has occurred " + error.message );
          });
    })
    //Save special
    .then(() => {
        //Get the add form data
        var addCategory = document.getElementById('add_category');
        var addTypeOfSpecial = document.getElementById('add_type_of_special');
        var addDescription = document.getElementById('add_description');

        //Create special from user's enteries
        var special = {
            Category: addCategory.value,
            Type_Of_Special: addTypeOfSpecial.value,
            Description: addDescription.value
        }

        //Save special to db
        Backendless.Data.of('Special').save( special )
        .then( function( savedObject ) {
            specialObjectId = savedObject.objectId;
            console.log( "new Special instance has been saved" );
            })
        .catch( function( error ) {
            console.log( "an error has occurred " + error.message );
            });
    })
    //Add special to establishment/form relation
    .then(() => {

        //These are undefined even though they are declared above
        console.log(establishmentObjectId);
        console.log(specialObjectId);

        var parentObject = { objectId:establishmentObjectId };
        var childObject = { objectId:specialObjectId };
        var children = [ childObject ];

        Backendless.Data.of( "Establishment" ).addRelation( parentObject, "establishmentSpecials", children )
        .then( function( count ) {
          console.log( "relation has been set" );
        })
        .catch( function( error ) {
          console.log( "server reported an error - " + error.message );
        });

    })

非常感谢

【问题讨论】:

  • 返回你要等待的promise,当它完成时,下一个.then会被执行
  • 创建promise链,然后返回promise。它会尝试解决它。 return Backendless.Data.of( "Establishment" )

标签: javascript promise backendless


【解决方案1】:

每当您在 Promise 链中时,99% 的情况下,当您创建一个新的 Promise(使用 API 调用,或使用 new Promise 等)时,您应该返回它,或者将它与别的东西(比如 Promise.all 并返回 that)。这意味着可以在更高级别处理可能的拒绝,并且意味着链中的 下一个 .then 将仅在前一个 .then 完成后开始。

每次更换

Backendless.Data.of(

return Backendless.Data.of(

另外,您可能希望在每个级别都成为catching,就像您目前正在做的那样 - 每当您 catch 时,您会将被拒绝的 Promise 变成已解决的 Promise , 和后续的 .thens 可能会在前面的 .then 中的所有内容都成功完成的假设下运行。对于像这样的顺序异步操作,如果任何地方出现错误,您可能希望停止整个过程,而不是尝试继续(这可能会导致错误)。

例如,如果Backendless.Data.of('Establishment').save 失败,那么establishmentObjectId 永远不会被分配到,并且稍后尝试在最终的.then 中使用它将不起作用。与specialObjectId 类似。

对于这段代码,还有一个更好的模式可以遵循:不要使用两个单独的.thens,一个获取establishmentObjectId,一个获取specialObjectId,考虑让这些操作并行运行,并且通过Promise.all 完成后运行最终的.then。大致如下:

const getEstablishmentObjectId = () => {
  //Get the add form data
  // ...
  //Create establishment from user's enteries
  var establishment = {
    // ...
  }
  //Save establishment to db
  return Backendless.Data.of('Establishment').save(establishment)
    .then(savedObject => savedObject.objectId);
};
const getSpecialObjectId = () => {
    // ...
    return Backendless.Data.of('Special').save(special)
      .then(savedObject => savedObject.objectId);
};

Promise.all([
  getEstablishmentObjectId(),
  getSpecialObjectId(),
]).then(([establishmentObjectId, specialObjectId]) => {
    console.log(establishmentObjectId);
    console.log(specialObjectId);
    var parentObject = {
      objectId: establishmentObjectId
    };
    // etc
  })
  .catch((error) => {
    console.log('Error', error);
  });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多