javascript - Angular 2 promise ไม่รอให้ promise ซ้อนกันนั้นเสร็จสิ้น?
ในกรณีของฉัน ฉันต้องดึงรายการลูกค้าจาก customerService และส่งกลับไปยังคอมโพเนนต์ กรุณาช่วยใครก็ได้ โดยการเขียนวิธี getCustomersList ใหม่
import { Injectable } from '@angular/core';
import { SQLite } from 'ionic-native';
@Injectable()
export class CustomerService {
private sDBName:string;
private db;
private isDBExist:boolean = false;
constructor() {}
setDBName(sDBName:string) {
this.sDBName = sDBName;
}
connect():Promise<any> {
this.db = new SQLite();
return this.db.openDatabase({
name: this.sDBName,
location: 'default'
});
}
getCustomersList():Promise<any> {
return Promise.resolve(()=>{
return this.connect().then(()=>{
this.isDBExist = true;
let sql = 'SELECT * FROM customer ORDER BY customer_id DESC LIMIT 10';
return this.db.executeSql(sql, {}).then((result)=>{
let customers = [];
for(let i=0; i<result.rows.length; i++) {
customers.push(result.rows.item(i));
}
return customers;
},(err)=>{
this.debug('Unable to select customers', err);
return [];
});
},(err)=>{
this.debug('Unable to open database', err);
return [];
});
});
}
}
คำตอบ #1
คุณใช้ Promise ในลักษณะที่ไม่เป็นธรรมชาติอย่างยิ่ง Promises ถูกสร้างขึ้นมาเพื่อกำจัดสิ่งที่เรียกว่าความนรกของ callback Promises ควรลดความซับซ้อนของโค้ดแบบอะซิงโครนัส แต่สิ่งที่คุณกำลังทำอยู่คือเส้นทางตรงสู่ความนรกของ callback
ฉันได้เขียนฟังก์ชันของคุณใหม่เล็กน้อยเพื่อให้ทำงานตามมาตรฐานของ Promise มันอาจจะไม่ใช่วิธีแก้ที่ใช้งานได้ทันที แต่คุณไม่ได้ให้ plunker ใด ๆ กับเรา ดังนั้นนี่จึงเป็นเพียงแนวคิด:
getCustomersList(): Promise<any> {
return this.connect()
.catch(err => throw new Error('Unable to open database', err))
.then(() => {
this.isDBExist = true;
return this.db.executeSql('SELECT * FROM customer ORDER BY customer_id DESC LIMIT 10', {})
})
.catch('cannot execute query')
.then(result => result.rows.map(row => row.item(i)))
.catch(err => {
this.debug('Unable to select customers', err);
return [];
});
}
ฉันเชื่อจริงๆ ว่าการเชื่อมต่อกับฐานข้อมูลไม่ควรทำที่นี่ แต่ควรทำที่บริการฐานข้อมูลทั่วไปซึ่งจะเป็นชั้นฐานข้อมูลของคุณ ในอุดมคติ เมื่อคุณเรียกฟังก์ชันนี้ ฐานข้อมูลควรจะเชื่อมต่อเรียบร้อยแล้วหรือข้อผิดพลาดควรถูกโยนออกมาแล้ว ดังนั้นควรใช้เวลาเพิ่มเติมในการคิดเกี่ยวกับสถาปัตยกรรม
คำตอบ #2
วิธีการของคุณ getCustomersList ควรคืนค่า รายการลูกค้า หรือฟังก์ชันที่ค้นหา รายการลูกค้า? หากเป็นกรณีแรก นี่คือวิธีที่ควรใช้:
getCustomersList(): Promise<any> {
return this.connect().then(() => {
this.isDBExist = true;
let sql = 'SELECT * FROM customer ORDER BY customer_id DESC LIMIT 10';
return this.db.executeSql(sql, {}).then((result) => {
let customers = [];
for (let i = 0; i < result.rows.length; i++) {
customers.push(result.rows.item(i));
}
return customers;
}, (err) => {
this.debug('Unable to select customers', err);
return [];
});
}, (err) => {
this.debug('Unable to open database', err);
return [];
})
}
