簡體   English   中英

如何使 .then 在進入下一個之前完全完成?

[英]How to make .then completely finish before moving onto the next?

所以,我正在向數據庫添加一個建立,然后向數據庫添加一個特殊的。 一個機構可以有 1 到很多特價,所以我試圖在第三個.then()下創建一個關系。 事情是,然后 3rd .then()在建立之前執行,並且特殊被添加到數據庫中。 我需要先將建立和特殊添加到數據庫中,因為我需要獲取它們的objectIds,varbuildingObjectId var establishmentObjectId; var specialObjectId;

我怎樣才能確保在建立關系之前檢索到建立和特殊 objectIds?

    //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 鏈中時,99% 的情況下,當您創建一個新的 Promise(使用 API 調用或使用new Promise等)時,您應該返回它,或者以其他方式將它與其他東西放在一起(例如一個Promise.all並返回那個)。 這意味着可以在更高級別處理可能的拒絕,並且意味着鏈中的下一個.then只會在前一個.then完成后開始。

改變每

Backendless.Data.of(

return Backendless.Data.of(

此外,您可能希望在每個級別都進行catch ing,就像您目前所做的那樣 - 每當您catch ,您都會將一個被拒絕的 Promise 變成一個已解決的 Promise,隨后的.then s 可能會假設一切都在運行在之前.then成功完成。 對於像這樣的順序異步操作,如果任何地方出現錯誤,您可能希望停止整個過程,而不是嘗試繼續(這可能會導致錯誤)。

例如,如果Backendless.Data.of('Establishment').save失敗,那么establishmentObjectId永遠不會被分配到,並試圖在決賽以后使用它.then將無法正常工作。 specialObjectId類似的事情。

對於此代碼,也有一個更好的模式來遵循:而不是使用兩個獨立的.then S,一個拿到establishmentObjectId和一個拿到specialObjectId ,可以考慮讓這些操作並行運行,並運行最后.then之后他們”通過Promise.all重新完成。 類似的東西:

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);
  });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM