循环承诺

Tho*_*lle 6 javascript asynchronous promise

我的情况是我必须按顺序从服务器获取数据,我希望在Promises的帮助下完成.这是我到目前为止所尝试的:

function getDataFromServer() {
  return new Promise(function(resolve, reject) {
    var result = [];

    (function fetchData(nextPageToken) {

      server.getData(nextPageToken).then(function(response) {
        result.push(response.data);
        if (response.nextPageToken) {
          fetchData(response.nextPageToken);
        } else {
          resolve(result);
        }
      });

    })(null);

  });
}

getDataFromServer().then(function(result) {
  console.log(result);
});
Run Code Online (Sandbox Code Playgroud)

第一次获取成功,但后续调用server.getData()未运行.我认为它与第一个then()没有实现有关.我该如何缓解这个问题?

jib*_*jib 2

Nimrand回答了您的问题(缺少catch),但这是您的代码,没有承诺构造函数反模式

function getDataFromServer() {
  var result = [];

  function fetchData(nextPageToken) {
    return server.getData(nextPageToken).then(function(response) {
      result.push(response.data);
      if (response.nextPageToken) {
        return fetchData(response.nextPageToken);
      } else {
        return result;
      }
    });
  }
  return fetchData(null);
}

getDataFromServer().then(function(result) {
  console.log(result);
})
.catch(function(e) {
  console.error(e);
});
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,递归与 Promise 配合得很好。

function getDataFromServer() {
  var result = [];

  function fetchData(nextPageToken) {
    return server.getData(nextPageToken).then(function(response) {
      result.push(response.data);
      if (response.nextPageToken) {
        return fetchData(response.nextPageToken);
      } else {
        return result;
      }
    });
  }
  return fetchData(null);
}

getDataFromServer().then(function(result) {
  console.log(result);
})
.catch(function(e) {
  console.error(e);
});
Run Code Online (Sandbox Code Playgroud)
var console = { log: function(msg) { div.innerHTML += "<p>"+ msg +"</p>"; }};

var responses = [
  { data: 1001, nextPageToken: 1 },
  { data: 1002, nextPageToken: 2 },
  { data: 1003, nextPageToken: 3 },
  { data: 1004, nextPageToken: 4 },
  { data: 1005, nextPageToken: 0 },
];

var server = {
  getData: function(token) {
    return new Promise(function(resolve) { resolve(responses[token]); });
  }
};

function getDataFromServer() {
  var result = [];

  function fetchData(nextPageToken) {
    return server.getData(nextPageToken).then(function(response) {
      result.push(response.data);
      if (response.nextPageToken) {
        return fetchData(response.nextPageToken);
      } else {
        return result;
      }
    });
  }
  return fetchData(0);
}

getDataFromServer().then(function(result) {
  console.log(result);
})
.catch(function(e) { console.log(e); });
Run Code Online (Sandbox Code Playgroud)

  • 是的,当一个承诺被“解决”为另一个“待处理”的承诺时,第一个承诺将保持“待处理”状态,并且在第二个承诺“解决”之前不会被“履行”。在这种情况下,第一个承诺既是“已解决”又是“待定”,但不是“已实现”,使用[状态和命运]中的术语(https://github.com/domenic/promises-unwrapping/blob/master) /docs/states-and-fates.md)。 (2认同)