![](/img/trans.png)
[英]How to use javascript promises that waits for jquery ajax to finish before moving onto next promise?
[英]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.