首页 > 解决方案 > 使用 JavaScript Promise 时如何传递信息

问题描述

在某一时刻,我们用 . 多次调用我们的后端fetch。每个调用都会返回一个 Promise,我们将其收集并传递给我们的responseHandler. 这个处理程序应该在每个响应进来时调度 redux 动作。动作将根据两个因素而不同:

所以我们有这个

function save(objects) {
    let promises = objects.map(object => {
        let promise = fetch(url, {..., body: object});
    });
    responseHandler(promises);
}

function responseHandler(promises) {
    for (let promise of promises) {
        promise
            .then(r => {
                return r.json();
            })
            .then(body => dispatchSomeAction(body));
    }
}

到目前为止,一切都很好。但是现在我们需要来自接收对象save的匿名函数内部和内部的信息。response所以我想出了以下方法。但是捎带 Promise 对象感觉不对。我不能说为什么。

function save(objects) {
    let promises = objects.map(object => {
        let promise = fetch(url, {..., body: object});
        promise._objectType = object._type;
    });
    responseHandler(promises);
}

function responseHandler(promises) {
    for (let promise of promises) {
        promise
            .then(r => {
                promise._status = r.status;
                return r.json();
            })
            .then(body => dispatchSomeAction({
                status: promise._status,
                type: promise._type, ...body
            }));
    }
}

可以看出,每次我希望某个范围的值在以后可用时,我都会将它放在 Promise 对象上,因为该 Promise 对象在所有其他范围内。有没有更清洁的方法?

注意:后端返回一个不包含该_type属性的对象(实际上我在将它们发送到后端之前清除了这些标志的对象。这是一个前端标志,当答案到来时我仍然需要它)

标签: javascriptpromisees6-promise

解决方案


您必须携带该物品。使用 ES6 结构化和解构并不是很笨拙:

function save(objects){
  let promises = objects.map(object => {
    return fetch(url, {..., body: object}).then(r => ({r,type:object._type}));
  }
  responseHandler(promises)
}

function responseHandler(promises){
  for (let promise of promises){
    promise
      .then(({r,type}) => {
        return r.json().then(body => dispatchSomeAction({status: r.status, type, ...body));
      });
  }
}

请注意,您实际上根本不需要对状态做任何事情,因为它仍然在使用它的范围内。


推荐阅读