理解Promise

理解Promise
fetch('http://api.example.com/users')
  .then(response => response.json())
  .then(data => {
    console.log(data); // 将返回的JSON数据打印到控制台
    const username = data.username; // 假设JSON响应中有一个名为username的字段
    console.log(`Username: ${username}`);
  })
  .catch(error => {
    console.error('Error:', error);
  });

.json()方法将响应解析为JSON格式,并返回一个包含解析后的数据的Promise

response.json() 方法返回一个 Promise 对象,该对象在成功解析响应体为 JSON 数据后被解析为具体的值。这意味着你可以在 .then() 方法中访问到 JSON 数据。

当调用 .then() 方法时,它的回调函数将在前一个 Promise 对象(在这种情况下是 response.json() 返回的 Promise 对象)成功解析为 JSON 数据之后被触发。回调函数接收到的参数 data 将是 JSON 数据的解析结果,即解析后的 JavaScript 对象或数组。

用async/await重写可以更简洁,不过和.then()台面下的操作是一样的。async/await 提供了一种更具同步风格的编码方式来处理异步操作


interface MessagePort {
    onMessage: (message: any) => void;
    send(message: any): void;
}
 
class Client {
    private port: MessagePort;
    private requestId = 0;
    private callbacks: { [id: number]: [(value: any) => void, (reason: any) => void] } = {};
 
    constructor(port: MessagePort) {
        this.port = port;
        this.port.onMessage = this.handleMessage.bind(this);
    }
 
    // 用于发送请求并获取Promise响应
    request(method: string, params: any): Promise<any> {
        const id = this.requestId++;
        return new Promise((resolve, reject) => {
            // 保存回调以供稍后使用
            this.callbacks[id] = [resolve, reject];
            // 发送请求到服务器
            this.port.send({
                id: id,
                method: method,
                params: params
            });
        });
    }
 
    // 处理来自服务器的响应
    private handleMessage(message: any) {
        const callback = this.callbacks[message.id];
        if (!callback) return;
 
        const [resolve, reject] = callback;
        if (message.error) {
            reject(message.error);
        } else {
            resolve(message.result);
        }
 
        // 删除已处理的回调
        delete this.callbacks[message.id];
    }
}
 
const port = getServerMessagePort();
const client = new Client(port);
// 示例用法
client.request('foo', { arg: 42 }).then(response => {
    console.log('Response received:', response);
}).catch(error => {
    console.error('Error received:', error);
});

下面有人推荐的