Tôi đang gặp phải sự cố mà tôi không hiểu đầy đủ. Tôi cảm thấy như có khả năng các khái niệm mà tôi chưa nắm bắt được, mã có thể được tối ưu hóa và có thể một lỗi được đưa ra để có biện pháp tốt.Không đồng bộ/Đang chờ không chờ đợi
Để đơn giản hóa đáng kể lưu lượng tổng thể:
- Một yêu cầu được thực hiện cho một API bên ngoài
- Các trở JSON đối tượng được phân tích và quét tài liệu tham khảo liên kết
- Nếu bất kỳ tài liệu tham khảo liên kết được tìm thấy, thêm yêu cầu được thực hiện để điền/thay thế các tham chiếu liên kết bằng dữ liệu JSON thực
- Sau khi tất cả các tham chiếu liên kết đã được thay thế, yêu cầu ban đầu được trả lại và sử dụng để tạo nội dung
Ở đây, là các yêu cầu ban đầu (# 1):
await Store.get(Constants.Contentful.ENTRY, Contentful[page.file])
Store.get được đại diện bởi:
async get(type, id) {
return await this._get(type, id);
}
nào gọi:
_get(type, id) {
return new Promise(async (resolve, reject) => {
var data = _json[id] = _json[id] || await this._api(type, id);
console.log(data)
if(isAsset(data)) {
resolve(data);
} else if(isEntry(data)) {
await this._scan(data);
resolve(data);
} else {
const error = 'Response is not entry/asset.';
console.log(error);
reject(error);
}
});
}
Cuộc gọi API :
_api(type, id) {
return new Promise((resolve, reject) => {
Request('http://cdn.contentful.com/spaces/' + Constants.Contentful.SPACE + '/' + (!type || type === Constants.Contentful.ENTRY ? 'entries' : 'assets') + '/' + id + '?access_token=' + Constants.Contentful.PRODUCTION_TOKEN, (error, response, data) => {
if(error) {
console.log(error);
reject(error);
} else {
data = JSON.parse(data);
if(data.sys.type === Constants.Contentful.ERROR) {
console.log(data);
reject(data);
} else {
resolve(data);
}
}
});
});
}
Khi một mục được trả lại, nó được quét:
_scan(data) {
return new Promise((resolve, reject) => {
if(data && data.fields) {
const keys = Object.keys(data.fields);
keys.forEach(async (key, i) => {
var val = data.fields[key];
if(isLink(val)) {
var child = await this._get(val.sys.linkType.toUpperCase(), val.sys.id);
this._inject(data.fields, key, undefined, child);
} else if(isLinkArray(val)) {
var children = await* val.map(async (link) => await this._get(link.sys.linkType.toUpperCase(), link.sys.id));
children.forEach((child, index) => {
this._inject(data.fields, key, index, child);
});
} else {
await new Promise((resolve) => setTimeout(resolve, 0));
}
if(i === keys.length - 1) {
resolve();
}
});
} else {
const error = 'Required data is unavailable.';
console.log(error);
reject(error);
}
});
}
Nếu tài liệu tham khảo liên kết được tìm thấy, yêu cầu bổ sung được thực hiện và sau đó kết quả JSON được tiêm vào JSON gốc ở vị trí của tài liệu tham khảo:
_inject(fields, key, index, data) {
if(isNaN(index)) {
fields[key] = data;
} else {
fields[key][index] = data;
}
}
Thông báo, tôi đang sử dụng async
, await
và Promise
's Tôi tin vào trang viên dự định của họ. Điều gì sẽ xảy ra: Các cuộc gọi cho dữ liệu được tham chiếu (kết quả là _scan) sẽ xuất hiện sau khi yêu cầu ban đầu được trả về. Điều này kết thúc việc cung cấp dữ liệu không đầy đủ cho mẫu nội dung.
thông tin bổ sung liên quan đến xây dựng của tôi thiết lập:
lời hứa Tại sao các bạn trộn và async/chờ: ' return new Promise (async (giải quyết, từ chối) => {...} '? Không nên là 'async _get (type, id) {...}' và không có lời hứa nào cả? – Shanoor